J'ai le HQL suivant
String FIND_PRODUCT_CLASS_ID = "SELECT pc.id FROM ProductClass pc"+
" JOIN ProductGroup pg ON pc.id = pg.productClassId" +
" JOIN Product p ON pg.id = p.id" +
" JOIN ProductSub ps ON p.id = ps.productId WHERE ps.id =:childProductSubId";
Lorsque j'exécute cette requête dans l'environnement Spring Hibernate, la trace de pile suivante est obtenue.
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Path expected for join! [SELECT pc.id FROM com.xxx.domain.ProductClass pc JOIN ProductGroup pg ON pc.id = pg.productClassId JOIN Product p ON pg.id = p.id JOIN ProductSub ps ON p.id = ps.productId WHERE ps.id =:childProductSubId]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.Java:91)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.Java:109)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.Java:284)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.Java:206)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.Java:158)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.Java:126)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.Java:88)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.Java:167)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.Java:301)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.Java:236)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.Java:1800)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.Java:328)
... 146 more
Toutefois, si je modifie la requête sans le mot clé join
comme ci-dessous, la procédure est réussie.
String FIND_PRODUCT_CLASS_ID = "SELECT pc.id FROM ProductClass pc, ProductGroup pg, " +
" Product p, ProductSub ps where pc.id = pg.productClassId "+
" and pg.id = p.id and p.id = ps.productId and ps.id =:childProductSubId";
Je sais que j'ai déjà trouvé la solution, mais je ne sais pas pourquoi cela ne fonctionne pas avec la clé join
key dans HQL. Sombody peut-il m'expliquer ceci s'il vous plait? Est-ce que cela a quelque chose à voir avec la cartographie? Dans mon cas, les objets sont mappés dans la couche Hibernate.
Nous devons fournir le chemin dans la requête HQL. C'est le "chemin attendu pour la jointure" l'exception à venir.
changer la requête quelque chose comme ci-dessous: S'il vous plaît modifier selon l'utilisation
String FIND_PRODUCT_CLASS_ID = "SELECT pc.id FROM ProductClass pc"+
" JOIN pc.ProductGroup pg " +
" JOIN pg.Product p " +
" JOIN p.ProductSub ps WHERE ps.id =:childProductSubId";'
S'il vous plaît se référer ceci .