web-dev-qa-db-fra.com

pourquoi ai-je le chemin attendu pour rejoindre quand j'utilise la clé de jointure Word dans hql

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.

2
newday

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 .

6
Ankur Singhal