Java QuerySyntaxException无效路径+JPA+Hibernate 5.4

Java QuerySyntaxException无效路径+JPA+Hibernate 5.4,java,hibernate,jpa,Java,Hibernate,Jpa,我试图根据CriteriaQuery获取总行数,但遇到异常 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 )]

我试图根据CriteriaQuery获取总行数,但遇到异常

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 )]
代码

}

映射是使用hbm xml文件完成的


您能告诉我如何修复它吗?

您有两个不同的问题。所以不能对它们使用相同的谓词,因为它们有不同的根

org.hibernate.hql.internal.ast.QuerySyntaxException:无效路径: 'generatedAlias1.package.id'[从中选择countgeneratedAlias0] com.test.Product作为generatedAlias0,其中generatedAlias1.package.id 例如:0]

GenerateDias1是来自另一个查询的产品的别名

要使谓词可重用,应创建方法返回谓词

Predicate getPredicate(Root<Product> root, CriteriaBuilder builder, Parameter param) {
   // returns predicate using root, builder and param you need
   return builder.equal(root.get("fieldName"), param);
}
然后在查询中使用它

CriteriaBuilder cb = session().getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root<Product> entity = query.from(Product.class);
query.where(getPredicate(entity, cb, param));

CriteriaBuilder cbCount = session().getCriteriaBuilder();
CriteriaQuery<Long> queryCount = cbCount.createQuery(Long.class);
Root<Product> entityCount = queryCount.from(Product.class);
queryCount.where(getPredicate(entityCount, cbCount, param));

您有两个不同的查询。所以不能对它们使用相同的谓词,因为它们有不同的根

org.hibernate.hql.internal.ast.QuerySyntaxException:无效路径: 'generatedAlias1.package.id'[从中选择countgeneratedAlias0] com.test.Product作为generatedAlias0,其中generatedAlias1.package.id 例如:0]

GenerateDias1是来自另一个查询的产品的别名

要使谓词可重用,应创建方法返回谓词

Predicate getPredicate(Root<Product> root, CriteriaBuilder builder, Parameter param) {
   // returns predicate using root, builder and param you need
   return builder.equal(root.get("fieldName"), param);
}
然后在查询中使用它

CriteriaBuilder cb = session().getCriteriaBuilder();
CriteriaQuery<Product> query = cb.createQuery(Product.class);
Root<Product> entity = query.from(Product.class);
query.where(getPredicate(entity, cb, param));

CriteriaBuilder cbCount = session().getCriteriaBuilder();
CriteriaQuery<Long> queryCount = cbCount.createQuery(Long.class);
Root<Product> entityCount = queryCount.from(Product.class);
queryCount.where(getPredicate(entityCount, cbCount, param));

您是否可以提供sql来显示您想要实现的目标。@SternK该查询应该创建,比如从com.test.Product中选择countgeneratedAlias0作为generatedAlias0,其中generatedAlias0.package.id like:param0您是否可以显示您的实体-产品映射。@SternK已更新。您能告诉我如何在queryCount中使用查询所使用的所有条件吗?queryCount.wherequery.getRestriction-此行创建的别名与创建问题的别名不同,您是否可以提供sql来显示您想要实现的目标。@SternK该查询应该创建,比如从com.test.Product中选择countgeneratedAlias0作为generatedAlias0,其中generatedAlias0.package.id like:param0您是否可以显示您的实体-产品映射。@SternK已更新。您能告诉我如何在queryCount中使用查询所使用的所有条件吗?queryCount.wherequery.getRestriction-此行正在创建一个不同的别名,这会造成问题,谢谢。是的,我知道了,所以我更改了代码并使用了两个不同的查询。谢谢。是的,我知道了,所以我修改了代码,使用了两个不同的查询。