我想得到动态生成的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 {显式,不是集合连接,获取连接,提取非-lazy properties,classAlias = product,role = org.myCompany.applicant.entity.Applicant.products,tableName = PRS_DEV.PRODUCT,tableAlias = products1_,origin = PRS_DEV.APPLICANT applicant0_,colums = {applicant0_.APPLICANT_ID,className = org。 myCompany.product.entity.Product}}] [从org.myCompany.applicant.entity选择计数()。申请人申请人LEFT OUTER JOIN FETCH applicant.products product ];嵌套异常是:java.lang.IllegalArgumentException:org.hibernate.QueryException:查询指定的连接提取,但是提取的关联的所有者在选择列表中不存在[FromElement {显式,不是集合连接,获取连接,提取非-lazy properties,classAlias = product,role = org.myCompany.applicant.entity.Applicant.products,tableName = PRS_DEV.PRODUCT,tableAlias = products1_,origin = PRS_DEV.APPLICANT applicant0_,colums = {applicant0_.APPLICANT_ID,className = org。 myCompany.product.entity.Product}}] [从org.myCompany.applicant.entity选择计数()。申请人申请人LEFT OUTER JOIN FETCH applicant.products product]
答案 0 :(得分:13)
这应该可以解决问题:
select count(*) FROM Company c JOIN ...
没有涉及子选择,只是返回Company
,而不是返回FETCH
。
编辑: select count(product) from org.myCompany.applicant.entity.Applicant applicant
LEFT OUTER JOIN applicant.products product
现在不合适。你不是从查询中返回实体,而是只返回计数,因此,Hibernate会抱怨。删除它应该有所帮助:
{{1}}
答案 1 :(得分:12)
您可以使用以下方法获取查询结果的计数:
criteria.setProjection(Projections.rowCount());
count=(Long) criteria.uniqueResult();
希望这会有所帮助