Hibernate HQL:获取结果计数而不实际返回它们

Mar*_*kis 17 hibernate hql

我想获得动态生成的HQL查询结果的计数,而不是实际得到结果列表.假设我的查询是这样的:

select Company company LEFT OUTER JOIN FETCH products product
Run Code Online (Sandbox Code Playgroud)

我在Hibernate文档中读到:

您可以计算查询结果的数量而不返回它们:

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Run Code Online (Sandbox Code Playgroud)

我怀疑我应该用我的查询替换....但是这不起作用,因为HQL不支持FROM中的子选择.

那么,我应该如何计算动态生成的HQL查询的结果?我认为通过执行它并获取结果列表的.size()可能是不必要的开销.

干杯!

**更新:**

我用这个正则表达式来转换我的查询:

Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult();
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

大段引用

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中选择count().申请人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 选择count().申请人LEFT OUTER JOIN FETCH applicant.products product]

Hen*_*ing 13

这应该做的伎俩:

select count(*) FROM Company c JOIN ...
Run Code Online (Sandbox Code Playgroud)

没有涉及子选择,只是不返回Company,您返回计数.

编辑:FETCH是出位了.你不是从查询中返回实体,而是只返回计数,因此,Hibernate会抱怨.删除它应该有助于:

select count(product) from org.myCompany.applicant.entity.Applicant applicant 
    LEFT OUTER JOIN applicant.products product
Run Code Online (Sandbox Code Playgroud)


小智 12

您可以使用以下命令获取查询结果的计数:

criteria.setProjection(Projections.rowCount());
count=(Long) criteria.uniqueResult();
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 我为'count'搜索了Criteria API,这个提示对我很有用. (5认同)
  • 这没有用.rowCount()方法属于Criteria API,但OP使用的是HQL. (4认同)