我想获取动态生成的HQL查询的结果计数,而无需实际获取结果列表。说我的查询是这样的:
select Company company LEFT OUTER JOIN FETCH products product
我在Hibernate文档中看到:
您可以计算查询结果的数量而无需返回它们:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
我怀疑应该用查询替换 .... ,但这不起作用,因为HQL不支持FROM中的子选择。
那么,我应该如何计算动态生成的HQL查询的结果?我认为通过执行它并获取结果列表的.size()可能是不必要的开销。
干杯!
更新:
我使用此正则表达式转换查询:
Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult();
我得到这个:
块引用 EJB异常:嵌套的异常是:java.lang.IllegalArgumentException:org.hibernate.QueryException:查询指定的联接获取,但是选择列表中不存在所获取的关联的所有者[FromElement {显式,不是集合联接,获取联接,非获取-懒惰的属性,classAlias =产品,role = org.myCompany.applicant.entity.Applicant.products,tableName = PRS_DEV.PRODUCT,tableAlias = products1_,origin = PRS_DEV.APPLICANT申请人0_,列= {applicant0_.APPLICANT_ID,className = org。 myCompany.product.entity.Product}}] [ 从org.myCompany.applicant.entity.Applicant申请人LEFT OUTER JOIN FETCH申请人.products产品中 选择count( ) ]; 嵌套的异常是:java.lang.IllegalArgumentException:org.hibernate.QueryException:查询指定的联接获取,但是选择列表中不存在所获取的关联的所有者[FromElement {显式,不是集合联接,获取联接,非获取-懒惰的属性,classAlias =产品,role = org.myCompany.applicant.entity.Applicant.products,tableName = PRS_DEV.PRODUCT,tableAlias = products1_,origin = PRS_DEV.APPLICANT申请人0_,列= {applicant0_.APPLICANT_ID,className = org。 myCompany.product.entity.Product}}] [从org.myCompany.applicant.entity.Applicant申请人LEFT OUTER JOIN FETCH申请人.products产品中选择count()]
块引用
EJB异常:嵌套的异常是:java.lang.IllegalArgumentException:org.hibernate.QueryException:查询指定的联接获取,但是选择列表中不存在所获取的关联的所有者[FromElement {显式,不是集合联接,获取联接,非获取-懒惰的属性,classAlias =产品,role = org.myCompany.applicant.entity.Applicant.products,tableName = PRS_DEV.PRODUCT,tableAlias = products1_,origin = PRS_DEV.APPLICANT申请人0_,列= {applicant0_.APPLICANT_ID,className = org。 myCompany.product.entity.Product}}] [ 从org.myCompany.applicant.entity.Applicant申请人LEFT OUTER JOIN FETCH申请人.products产品中 选择count( ) ]; 嵌套的异常是:java.lang.IllegalArgumentException:org.hibernate.QueryException:查询指定的联接获取,但是选择列表中不存在所获取的关联的所有者[FromElement {显式,不是集合联接,获取联接,非获取-懒惰的属性,classAlias =产品,role = org.myCompany.applicant.entity.Applicant.products,tableName = PRS_DEV.PRODUCT,tableAlias = products1_,origin = PRS_DEV.APPLICANT申请人0_,列= {applicant0_.APPLICANT_ID,className = org。 myCompany.product.entity.Product}}] [从org.myCompany.applicant.entity.Applicant申请人LEFT OUTER JOIN FETCH申请人.products产品中选择count()]
这应该可以解决问题:
select count(*) FROM Company c JOIN ...
没有涉及子选择,只是返回而不是返回Company,而是返回计数。
Company
编辑: 该FETCH是地方出来了。您不是从查询中返回实体,而是仅返回计数,因此,Hibernate抱怨。删除它应该可以帮助:
FETCH
select count(product) from org.myCompany.applicant.entity.Applicant applicant LEFT OUTER JOIN applicant.products product