简体   繁体   中英

JPA - Join on same table

I got this request :

TypedQuery<ParamGenerauxExternes> q = entityMgr
            .createQuery("SELECT p FROM ParamGenerauxExternes p "
                    + "WHERE EXISTS "
                    + "(SELECT q FROM ParamGenerauxExternes q "
                    + "WHERE q.key.origine = :pOrigine "
                    + "AND q.key.typeParam LIKE :pTypeParametreBis "
                    + "AND p.key.sousType LIKE CONCAT('%',q.libelleParam) "
                    + "AND q.actif = 'Y') "
                    + "ORDER BY p.libelleParam", ParamGenerauxExternes.class)
            //.setParameter("pTypeParametre", "REL_TO_HOUSEHOLD")
            .setParameter("pOrigine", pOrigineGrc)
            .setParameter("pTypeParametreBis", "GRC_HOUSEHOLD_TYPE_P%");

But it doesn't work, I got this error message that tell a prenthesis is missing :

GRAVE: EJB Exception: : javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: ORA-00907: missing right parenthesis

The generated SQL by JPA has a parenthesis after the second select :

select
    paramgener0_.CODE_PARAM as CODE1_2823_,
    paramgener0_.ORIGINE as ORIGINE2823_,
    paramgener0_.SOUS_TYPE as SOUS3_2823_,
    paramgener0_.TYPE_PARAM as TYPE4_2823_,
    paramgener0_.ACTIF as ACTIF2823_,
    paramgener0_.LIBELLE_PARAM as LIBELLE6_2823_ 
from
    FOA_PARAM_GEN_EXTERNE paramgener0_ 
where
    exists (
        select
            (paramgener1_.CODE_PARAM,
            paramgener1_.ORIGINE,
            paramgener1_.SOUS_TYPE,
            paramgener1_.TYPE_PARAM) 
        from
            FOA_PARAM_GEN_EXTERNE paramgener1_ 
        where
            paramgener1_.ORIGINE=? 
            and (
                paramgener1_.TYPE_PARAM like ?
            ) 
            and (
                paramgener0_.SOUS_TYPE like '%'||paramgener1_.LIBELLE_PARAM
            ) 
            and paramgener1_.ACTIF='Y'
    ) 
order by
    paramgener0_.LIBELLE_PARAM

I don't know why hibernate add a parenthesis after the second select ? Please if you know what to do...

That query fails on Oracle but passes on, for example, Postgres. If you are using Oracle database, try setting Oracle SQL dialect to your JPA provider.
Hibernate SQL Dialects

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM