QuerySyntaxException 无效路径 + JPA + Hibernate 5.4

huangapple go评论110阅读模式
英文:

QuerySyntaxException Invalid path + JPA + Hibernate 5.4

问题

  1. 我正在尝试根据 CriteriaQuery 获取基于条件的总行数,但出现了异常
  2. org.hibernate.hql.internal.ast.QuerySyntaxException: 无效路径: 'generatedAlias1.package.id' [select count(generatedAlias0) from com.test.Product as generatedAlias0 where ( generatedAlias1.package.id like :param0 )]
  3. **代码**
  4. CriteriaBuilder cb = session().getCriteriaBuilder();
  5. CriteriaQuery<Product> query = cb.createQuery(Product.class);
  6. Root<Product> entity = query.from(Product.class);
  7. query.where(where_clause);
  8. CriteriaQuery<Long> queryCount = cb.createQuery(Long.class);
  9. Root<Product> entity = queryCount.from(query.getResultType());
  10. queryCount.where(query.getRestriction()) -- 这是问题出现的地方
  11. **实体**
  12. class Product{
  13. Package package;
  14. int quantity;
  15. /// getter setter 方法
  16. }
  17. class Package{
  18. String id;
  19. String name;
  20. String type
  21. /// getter setter 方法
  22. }
  23. 映射使用 hbm xml 文件完成。
  24. 你能告诉我如何解决这个问题吗?
英文:

I am trying to get the total row count based on the CriteriaQuery but got an exception

  1. org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: &#39;generatedAlias1.package.id&#39; [select count(generatedAlias0) from com.test.Product as generatedAlias0 where ( generatedAlias1.package.id like :param0 )]

Code

  1. CriteriaBuilder cb = session().getCriteriaBuilder();
  2. CriteriaQuery&lt;Product&gt; query = cb.createQuery(Product.class);
  3. Root&lt;Product&gt; entity = query.from(Product.class);
  4. query.where(where_clause);
  5. CriteriaQuery&lt;Long&gt; queryCount = cb.createQuery(Long.class);
  6. Root&lt;Product&gt; entity = queryCount.from(query.getResultType());
  7. queryCount.where(query.getRestriction()) -- this is where the problem is creating

Entity

  1. class Product{
  2. Package package;
  3. int quantity;
  4. /// getter setter method
  5. }
  6. class Package{
  7. String id;
  8. String name;
  9. String type
  10. /// getter setter method

}

mapping is done using hbm xml file.

can you please let me know how to fix it ?

答案1

得分: 10

你有两个不同的查询。因此,你不能对它们都使用相同的谓词,因为它们具有不同的根节点。

generatedAlias1 是另一个查询中 Product 的别名。

为了使谓词可重用,你应该创建一个方法来返回谓词:

  1. Predicate getPredicate(Root<Product> root, CriteriaBuilder builder, Parameter param) {
  2. // 使用 root、builder 和 param 返回谓词
  3. return builder.equal(root.get("fieldName"), param);
  4. }

然后在查询中使用它:

  1. CriteriaBuilder cb = session().getCriteriaBuilder();
  2. CriteriaQuery<Product> query = cb.createQuery(Product.class);
  3. Root<Product> entity = query.from(Product.class);
  4. query.where(getPredicate(entity, cb, param));
  5. CriteriaBuilder cbCount = session().getCriteriaBuilder();
  6. CriteriaQuery<Long> queryCount = cbCount.createQuery(Long.class);
  7. Root<Product> entityCount = queryCount.from(Product.class);
  8. queryCount.where(getPredicate(entityCount, cbCount, param));
英文:

You have two different queries. So you can't use the same predicate for both of them, because they have different roots.

> org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path:
> 'generatedAlias1.package.id' [select count(generatedAlias0) from
> com.test.Product as generatedAlias0 where ( generatedAlias1.package.id
> like :param0 )]

generatedAlias1 is alias for Product from another query

To make the predicate reusable you should create method returns predicate

  1. Predicate getPredicate(Root&lt;Product&gt; root, CriteriaBuilder builder, Parameter param) {
  2. // returns predicate using root, builder and param you need
  3. return builder.equal(root.get(&quot;fieldName&quot;), param);
  4. }

And then use it in queries

  1. CriteriaBuilder cb = session().getCriteriaBuilder();
  2. CriteriaQuery&lt;Product&gt; query = cb.createQuery(Product.class);
  3. Root&lt;Product&gt; entity = query.from(Product.class);
  4. query.where(getPredicate(entity, cb, param));
  5. CriteriaBuilder cbCount = session().getCriteriaBuilder();
  6. CriteriaQuery&lt;Long&gt; queryCount = cbCount.createQuery(Long.class);
  7. Root&lt;Product&gt; entityCount = queryCount.from(Product.class);
  8. queryCount.where(getPredicate(entityCount, cbCount, param));

huangapple
  • 本文由 发表于 2020年9月3日 03:53:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/63712693.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定