Take ProjectionRole into account in subquery projections #573

Closed
timowest opened this Issue Nov 27, 2013 · 5 comments

Comments

Projects
None yet
2 participants
@timowest
Member

timowest commented Nov 27, 2013

Subqueries need to take into account the ProjectionRole based transformations. Currently this doesn't happen and e.g. RelationalPath instances aren't handled properly.

timowest added a commit that referenced this issue Nov 27, 2013

@timowest

This comment has been minimized.

Show comment
Hide comment
@timowest

timowest Dec 12, 2013

Member

Released in 3.3.0.BETA2

Member

timowest commented Dec 12, 2013

Released in 3.3.0.BETA2

@timowest timowest closed this Dec 12, 2013

@sonialargher

This comment has been minimized.

Show comment
Hide comment
@sonialargher

sonialargher Apr 1, 2014

Hi,

I'm using Querydsl_sql 3.3.2 and I have this code...

Please, look the sql select generated: at the end you'll find ', rich_mvrs.MUOVERSI_Richiedente' that represent the subquery alias point name of table. There is no fields or * specified.
Are there some mistakes in my code or is a bug?

QSQL_Domande domande = QSQL_Domande.Domande;
        QSQL_Domande domande_icef = new QSQL_Domande("dom_icef");
        QSQL_Doc doc = QSQL_Doc.Doc;
        QSQL_Familiari fam = QSQL_Familiari.Familiari;
        QSQL_DichIcef dich = QSQL_DichIcef.DichIcef;

        QSQL_MUOVERSIKmAssegnati mvrAss = QSQL_MUOVERSIKmAssegnati.MUOVERSIKmAssegnati;
        QSQL_MUOVERSIRichiedente mvrRich = QSQL_MUOVERSIRichiedente.MUOVERSIRichiedente;

        QSQL_Soggetti soggetti = QSQL_Soggetti.Soggetti;

        QSQL_CElaOUT c1 = new QSQL_CElaOUT("c1");

        QSQL_CElaIN c_elain = QSQL_CElaIN.CElaIN;

        PathBuilder<Tuple>   rich_mvrs     = new PathBuilder<Tuple>(Tuple.class, "rich_mvrs");


        SQLQuery queryUsers = queryDslJdbcTemplateViaHibernateSession.getQuery();
        queryUsers
        .from(domande)
        .innerJoin(doc).on(domande.iDDomanda.eq(doc.id))
        .innerJoin(fam).on(domande.iDDomanda.eq(fam.iDDomanda))
        .innerJoin(dich).on(fam.iDDichiarazione.eq(dich.iDDichiarazione))
        .innerJoin(soggetti).on(dich.iDSoggetto.eq(soggetti.iDSoggetto))
        .innerJoin(c_elain).on(domande.iDDomanda.eq(c_elain.iDDomanda))
        .innerJoin(c1).on(domande.iDDomanda.eq(c1.iDDomanda))
        .innerJoin(mvrAss).on(mvrAss.codiceFiscale.eq(domande.codiceFiscale));

        queryUsers.leftJoin(
                new SQLSubQuery()
                .from(mvrRich)
                .innerJoin(domande_icef).on(mvrRich.iDDomanda.eq(domande_icef.iDDomanda))
                .list(mvrRich, domande_icef.codiceFiscale), rich_mvrs )
        .on(mvrAss.codiceFiscale.eq(rich_mvrs.get(domande_icef.codiceFiscale)) );

        queryUsers.orderBy(domande.iDDomanda.asc())
        .where(domande.iDEnteErogatore.gt(0))

        .where(c_elain.node.eq("anno"))
        .where(c_elain.inputValue.eq(new Double(2012)))
        .where(c1.node.eq("mensile"))
        .where(c1.numericValue.gt(0))

        .where(domande.iDServizio.in(new Integer[]{30000, 30001}))
        .where(mvrAss.anno.eq((short)2014));

        queryUsers.where(doc.iDTpStato.goe(CostantiImpl.ID_TP_STATO_TRASMESSA))
        .where(doc.crc.isNotNull());        

        List<Tuple> result = queryUsers.list(soggetti, mvrAss, domande, rich_mvrs.get(mvrRich));

        return result;
select Soggetti.proposto_documento_accettazione_firma_grafometrica, Soggetti.id_assistito_apss, Soggetti.ID_user, Soggetti.ID_soggetto, Soggetti.deceduto_apss, Soggetti.ID_tp_stato_soggetto, Soggetti.cognome, Soggetti.ID_provincia_nascita, Soggetti.codice_fiscale, Soggetti.nome_apss, Soggetti.codice_fiscale_3, Soggetti.codice_fiscale_2, Soggetti.ID_tp_sex, Soggetti.ID_luogo_nascita, Soggetti.data_nascita, Soggetti.nome, Soggetti.comune_estero, Soggetti.validazione_apss, Soggetti.conome_apss, Soggetti.annotazioni, MUOVERSI_km_assegnati.assegno_cura, MUOVERSI_km_assegnati.km_assegnati, MUOVERSI_km_assegnati.anno, MUOVERSI_km_assegnati.reddito_garanzia, MUOVERSI_km_assegnati.codice_fiscale, Domande.lavoro_femminile, Domande.banca_pagamento, Domande.IBAN_corretto, Domande.handicap_75_certificato_da, Domande.recapito_postale, Domande.escludi_ufficio, Domande.sottoscrizione_verbale, Domande.CIN_pagamento, Domande.n_civ_residenza, Domande.sottoscritta_in_presenza, Domande.proprieta_non_occupata, Domande.n_invalidi_66_75, Domande.fax, Domande.CAB_pagamento, Domande.ID_periodo, Domande.ID_comune_residenza, Domande.ID_provincia_residenza, Domande.cap_residenza, Domande.cognome, Domande.ID_provincia_nascita, Domande.handicap_66_75_certificato_da, Domande.ID_tp_sex, Domande.canone_locazione, Domande.Codice_stato, Domande.n_invalidi_75, Domande.indirizzo_residenza, Domande.nome, Domande.IBAN, Domande.frazione_residenza, Domande.sottoscritta_con_documento, Domande.ID_comune_catastale, Domande.cognome_intestatario, Domande.un_genitore, Domande.telefono_residenza, Domande.genitori_lavoratori, Domande.ID_servizio, Domande.ID_soggetto, Domande.codice_fiscale, Domande.intestatario_pagamento, Domande.escludi_motivazione, Domande.ID_ente_erogatore, Domande.ID_luogo_nascita, Domande.e_mail, Domande.data_nascita, Domande.cellulare, Domande.Cc_pagamento, Domande.ID_tp_pagamento, Domande.nome_intestatario, Domande.ID_sportello, Domande.proprietario_residenza, Domande.ID_tp_cittadinanza, Domande.mq, Domande.estremi_contratto_locazione, Domande.in_locazione, Domande.ubicazione_banca_pagamento, Domande.ABI_pagamento, Domande.BBAN_corretto, Domande.ID_tp_monogenitore, Domande.ID_domanda, rich_mvrs.MUOVERSI_Richiedente
from Domande Domande
inner join Doc Doc
on Domande.ID_domanda = Doc.ID
inner join Familiari Familiari
on Domande.ID_domanda = Familiari.ID_domanda
inner join Dich_icef Dich_icef
on Familiari.ID_dichiarazione = Dich_icef.ID_dichiarazione
inner join Soggetti Soggetti
on Dich_icef.ID_soggetto = Soggetti.ID_soggetto
inner join C_ElaIN C_ElaIN
on Domande.ID_domanda = C_ElaIN.ID_domanda
inner join C_ElaOUT c1
on Domande.ID_domanda = c1.ID_domanda
inner join MUOVERSI_km_assegnati MUOVERSI_km_assegnati
on MUOVERSI_km_assegnati.codice_fiscale = Domande.codice_fiscale
left join (select ?, dom_icef.codice_fiscale
from MUOVERSI_Richiedente MUOVERSI_Richiedente
inner join Domande dom_icef
on MUOVERSI_Richiedente.ID_domanda = dom_icef.ID_domanda) as rich_mvrs
on MUOVERSI_km_assegnati.codice_fiscale = rich_mvrs.codice_fiscale
where Domande.ID_ente_erogatore > ? and C_ElaIN.node = ? and C_ElaIN.input_value = ? and c1.node = ? and c1.numeric_value > ? and Domande.ID_servizio in (?, ?) and MUOVERSI_km_assegnati.anno = ? and Doc.ID_tp_stato >= ? and Doc.crc is not null
order by Domande.ID_domanda asc

Hi,

I'm using Querydsl_sql 3.3.2 and I have this code...

Please, look the sql select generated: at the end you'll find ', rich_mvrs.MUOVERSI_Richiedente' that represent the subquery alias point name of table. There is no fields or * specified.
Are there some mistakes in my code or is a bug?

QSQL_Domande domande = QSQL_Domande.Domande;
        QSQL_Domande domande_icef = new QSQL_Domande("dom_icef");
        QSQL_Doc doc = QSQL_Doc.Doc;
        QSQL_Familiari fam = QSQL_Familiari.Familiari;
        QSQL_DichIcef dich = QSQL_DichIcef.DichIcef;

        QSQL_MUOVERSIKmAssegnati mvrAss = QSQL_MUOVERSIKmAssegnati.MUOVERSIKmAssegnati;
        QSQL_MUOVERSIRichiedente mvrRich = QSQL_MUOVERSIRichiedente.MUOVERSIRichiedente;

        QSQL_Soggetti soggetti = QSQL_Soggetti.Soggetti;

        QSQL_CElaOUT c1 = new QSQL_CElaOUT("c1");

        QSQL_CElaIN c_elain = QSQL_CElaIN.CElaIN;

        PathBuilder<Tuple>   rich_mvrs     = new PathBuilder<Tuple>(Tuple.class, "rich_mvrs");


        SQLQuery queryUsers = queryDslJdbcTemplateViaHibernateSession.getQuery();
        queryUsers
        .from(domande)
        .innerJoin(doc).on(domande.iDDomanda.eq(doc.id))
        .innerJoin(fam).on(domande.iDDomanda.eq(fam.iDDomanda))
        .innerJoin(dich).on(fam.iDDichiarazione.eq(dich.iDDichiarazione))
        .innerJoin(soggetti).on(dich.iDSoggetto.eq(soggetti.iDSoggetto))
        .innerJoin(c_elain).on(domande.iDDomanda.eq(c_elain.iDDomanda))
        .innerJoin(c1).on(domande.iDDomanda.eq(c1.iDDomanda))
        .innerJoin(mvrAss).on(mvrAss.codiceFiscale.eq(domande.codiceFiscale));

        queryUsers.leftJoin(
                new SQLSubQuery()
                .from(mvrRich)
                .innerJoin(domande_icef).on(mvrRich.iDDomanda.eq(domande_icef.iDDomanda))
                .list(mvrRich, domande_icef.codiceFiscale), rich_mvrs )
        .on(mvrAss.codiceFiscale.eq(rich_mvrs.get(domande_icef.codiceFiscale)) );

        queryUsers.orderBy(domande.iDDomanda.asc())
        .where(domande.iDEnteErogatore.gt(0))

        .where(c_elain.node.eq("anno"))
        .where(c_elain.inputValue.eq(new Double(2012)))
        .where(c1.node.eq("mensile"))
        .where(c1.numericValue.gt(0))

        .where(domande.iDServizio.in(new Integer[]{30000, 30001}))
        .where(mvrAss.anno.eq((short)2014));

        queryUsers.where(doc.iDTpStato.goe(CostantiImpl.ID_TP_STATO_TRASMESSA))
        .where(doc.crc.isNotNull());        

        List<Tuple> result = queryUsers.list(soggetti, mvrAss, domande, rich_mvrs.get(mvrRich));

        return result;
select Soggetti.proposto_documento_accettazione_firma_grafometrica, Soggetti.id_assistito_apss, Soggetti.ID_user, Soggetti.ID_soggetto, Soggetti.deceduto_apss, Soggetti.ID_tp_stato_soggetto, Soggetti.cognome, Soggetti.ID_provincia_nascita, Soggetti.codice_fiscale, Soggetti.nome_apss, Soggetti.codice_fiscale_3, Soggetti.codice_fiscale_2, Soggetti.ID_tp_sex, Soggetti.ID_luogo_nascita, Soggetti.data_nascita, Soggetti.nome, Soggetti.comune_estero, Soggetti.validazione_apss, Soggetti.conome_apss, Soggetti.annotazioni, MUOVERSI_km_assegnati.assegno_cura, MUOVERSI_km_assegnati.km_assegnati, MUOVERSI_km_assegnati.anno, MUOVERSI_km_assegnati.reddito_garanzia, MUOVERSI_km_assegnati.codice_fiscale, Domande.lavoro_femminile, Domande.banca_pagamento, Domande.IBAN_corretto, Domande.handicap_75_certificato_da, Domande.recapito_postale, Domande.escludi_ufficio, Domande.sottoscrizione_verbale, Domande.CIN_pagamento, Domande.n_civ_residenza, Domande.sottoscritta_in_presenza, Domande.proprieta_non_occupata, Domande.n_invalidi_66_75, Domande.fax, Domande.CAB_pagamento, Domande.ID_periodo, Domande.ID_comune_residenza, Domande.ID_provincia_residenza, Domande.cap_residenza, Domande.cognome, Domande.ID_provincia_nascita, Domande.handicap_66_75_certificato_da, Domande.ID_tp_sex, Domande.canone_locazione, Domande.Codice_stato, Domande.n_invalidi_75, Domande.indirizzo_residenza, Domande.nome, Domande.IBAN, Domande.frazione_residenza, Domande.sottoscritta_con_documento, Domande.ID_comune_catastale, Domande.cognome_intestatario, Domande.un_genitore, Domande.telefono_residenza, Domande.genitori_lavoratori, Domande.ID_servizio, Domande.ID_soggetto, Domande.codice_fiscale, Domande.intestatario_pagamento, Domande.escludi_motivazione, Domande.ID_ente_erogatore, Domande.ID_luogo_nascita, Domande.e_mail, Domande.data_nascita, Domande.cellulare, Domande.Cc_pagamento, Domande.ID_tp_pagamento, Domande.nome_intestatario, Domande.ID_sportello, Domande.proprietario_residenza, Domande.ID_tp_cittadinanza, Domande.mq, Domande.estremi_contratto_locazione, Domande.in_locazione, Domande.ubicazione_banca_pagamento, Domande.ABI_pagamento, Domande.BBAN_corretto, Domande.ID_tp_monogenitore, Domande.ID_domanda, rich_mvrs.MUOVERSI_Richiedente
from Domande Domande
inner join Doc Doc
on Domande.ID_domanda = Doc.ID
inner join Familiari Familiari
on Domande.ID_domanda = Familiari.ID_domanda
inner join Dich_icef Dich_icef
on Familiari.ID_dichiarazione = Dich_icef.ID_dichiarazione
inner join Soggetti Soggetti
on Dich_icef.ID_soggetto = Soggetti.ID_soggetto
inner join C_ElaIN C_ElaIN
on Domande.ID_domanda = C_ElaIN.ID_domanda
inner join C_ElaOUT c1
on Domande.ID_domanda = c1.ID_domanda
inner join MUOVERSI_km_assegnati MUOVERSI_km_assegnati
on MUOVERSI_km_assegnati.codice_fiscale = Domande.codice_fiscale
left join (select ?, dom_icef.codice_fiscale
from MUOVERSI_Richiedente MUOVERSI_Richiedente
inner join Domande dom_icef
on MUOVERSI_Richiedente.ID_domanda = dom_icef.ID_domanda) as rich_mvrs
on MUOVERSI_km_assegnati.codice_fiscale = rich_mvrs.codice_fiscale
where Domande.ID_ente_erogatore > ? and C_ElaIN.node = ? and C_ElaIN.input_value = ? and c1.node = ? and c1.numeric_value > ? and Domande.ID_servizio in (?, ?) and MUOVERSI_km_assegnati.anno = ? and Doc.ID_tp_stato >= ? and Doc.crc is not null
order by Domande.ID_domanda asc
@timowest

This comment has been minimized.

Show comment
Hide comment
@timowest

timowest Apr 1, 2014

Member

@sonialargher Could you show the output of

  Expression<?> expr = new SQLSubQuery()
        .from(mvrRich)
        .innerJoin(domande_icef).on(mvrRich.iDDomanda.eq(domande_icef.iDDomanda))
        .list(mvrRich, domande_icef.codiceFiscale);

  SQLSerializer serializer = new SQLSerializer(new Configuration(SQLTemplates.DEFAULT));
  serializer.handle(expr);
  System.out.println(serializer.toString());
Member

timowest commented Apr 1, 2014

@sonialargher Could you show the output of

  Expression<?> expr = new SQLSubQuery()
        .from(mvrRich)
        .innerJoin(domande_icef).on(mvrRich.iDDomanda.eq(domande_icef.iDDomanda))
        .list(mvrRich, domande_icef.codiceFiscale);

  SQLSerializer serializer = new SQLSerializer(new Configuration(SQLTemplates.DEFAULT));
  serializer.handle(expr);
  System.out.println(serializer.toString());
@sonialargher

This comment has been minimized.

Show comment
Hide comment
@sonialargher

sonialargher Apr 1, 2014

I try to print my subquery and I obtain the right result.
Probably my problem doesn't have anything to do whit my subquery.

select MUOVERSI_Richiedente.ID_tp_relazione, MUOVERSI_Richiedente.indennita_accomp, MUOVERSI_Richiedente.data_domanda_ammissione, MUOVERSI_Richiedente.tessera, MUOVERSI_Richiedente.richiedente_non_beneficiario, MUOVERSI_Richiedente.km_richiesti, MUOVERSI_Richiedente.richiedente_beneficiario, MUOVERSI_Richiedente.indennita_accomp_importo, MUOVERSI_Richiedente.ID_domanda, MUOVERSI_Richiedente.n_domanda_ammissione, dom_icef.codice_fiscale
from MUOVERSI_Richiedente MUOVERSI_Richiedente
inner join Domande dom_icef
on MUOVERSI_Richiedente.ID_domanda = dom_icef.ID_domanda

I try to print my subquery and I obtain the right result.
Probably my problem doesn't have anything to do whit my subquery.

select MUOVERSI_Richiedente.ID_tp_relazione, MUOVERSI_Richiedente.indennita_accomp, MUOVERSI_Richiedente.data_domanda_ammissione, MUOVERSI_Richiedente.tessera, MUOVERSI_Richiedente.richiedente_non_beneficiario, MUOVERSI_Richiedente.km_richiesti, MUOVERSI_Richiedente.richiedente_beneficiario, MUOVERSI_Richiedente.indennita_accomp_importo, MUOVERSI_Richiedente.ID_domanda, MUOVERSI_Richiedente.n_domanda_ammissione, dom_icef.codice_fiscale
from MUOVERSI_Richiedente MUOVERSI_Richiedente
inner join Domande dom_icef
on MUOVERSI_Richiedente.ID_domanda = dom_icef.ID_domanda
@timowest

This comment has been minimized.

Show comment
Hide comment
@timowest

timowest Apr 1, 2014

Member

Could you maybe try to reproduce the issue with something simpler than the full query? That way I could better help to show what went wrong or provide a fix.

Member

timowest commented Apr 1, 2014

Could you maybe try to reproduce the issue with something simpler than the full query? That way I could better help to show what went wrong or provide a fix.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment