【问题标题】:Hibernate HQL: Get count of results without actually returning themHibernate HQL:获取结果计数而不实际返回它们
【发布时间】:2011-01-13 00:01:41
【问题描述】:

我想获取动态生成的 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{explicit,not a collection join,fetch join,fetch non -lazy properties,classAlias=product,role=org.myCompany.applicant.entity.Applicant.products,tableName=PRS_DEV.PRODUCT,tableAlias=products1_,origin=PRS_DEV.APPLICANT申请人0_,colums={applicant0_.APPLICANT_ID,className=org. myCompany.product.entity.Product}}] [select count() from org.myCompany.applicant.entity.Applicant 申请者 LEFT OUTER JOIN FETCH 申请者.products 产品 ];嵌套异常是:java.lang.IllegalArgumentException:org.hibernate.QueryException:查询指定连接提取,但选择列表中不存在提取关联的所有者 [FromElement{explicit,not a collection join,fetch join,fetch non -lazy properties,classAlias=product,role=org.myCompany.applicant.entity.Applicant.products,tableName=PRS_DEV.PRODUCT,tableAlias=products1_,origin=PRS_DEV.APPLICANT申请人0_,colums={applicant0_.APPLICANT_ID,className=org. myCompany.product.entity.Product}}] [select count() from org.myCompany.applicant.entity.Applicant 申请者 LEFT OUTER JOIN FETCH 申请者.products 产品]

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    这应该可以解决问题:

    select count(*) FROM Company c JOIN ...
    

    不涉及子选择,只是返回计数而不是返回Company

    编辑:FETCH 现在不合适了。您没有从查询中返回实体,而只是返回计数,因此 Hibernate 抱怨。删除它应该会有所帮助:

    select count(product) from org.myCompany.applicant.entity.Applicant applicant 
        LEFT OUTER JOIN applicant.products product
    

    【讨论】:

    • 是的,我试过了。我得到一个异常:QueryException:查询指定连接提取,但提取关联的所有者不在选择列表中。查看我的更新以获取完整的堆栈跟踪
    【解决方案2】:

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

    criteria.setProjection(Projections.rowCount());
    count=(Long) criteria.uniqueResult();
    

    希望对你有帮助

    【讨论】:

    • 这没有帮助。 rowCount() 方法属于 Criteria API,但 OP 使用的是 HQL。
    • 我搜索了 Criteria API for 'count',这个提示对我很有用。
    猜你喜欢
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多