【问题标题】:Hibernate Criteria - get count of subselectHibernate Criteria - 获取子选择的计数
【发布时间】:2015-01-01 09:05:35
【问题描述】:

我想计算满足某个条件的事件的数量。如果行数少于一百万,我想获得实际数字。如果超过 100 万,我不需要知道确切的数字,返回 100 万即可。

我想到了这个查询

select count(*) from (select id from events where x=10  limit 1000000) a

如何做到 Detached Criteria / sub criteria?

除了上面的sql,还有更好的方法吗?我正在使用 postgresql 9.3

【问题讨论】:

    标签: java hibernate jpa count criteria


    【解决方案1】:

    该查询不会比常规计数更好,因此请尝试以下操作:

    long count = ((Number) 
        session.createCriteria(Event.class)
               .setProjection(Projections.rowCount())
               .add(Restrictions.eq("x", 10))
               .uniqueResult()).longValue();
    long countLimit = Math.min(count, 1000000);
    

    【讨论】:

    • 感谢您的回答。代码“select count(*) from (select id from events where x=10 limit 1000000) a”运行得更快,因为它最多计算 1M 而不是整个表。在数完整个表格后做 min 需要更长的时间。
    • 不幸的是,Hibernate 只能在 WHERE 子句中使用子查询。您不能使用表表达式。为此,您需要使用本机查询。
    【解决方案2】:

    据我了解 如果大于 1000000,您必须计算一些重新编码,它应该显示 100 万 + 否则精确计数。 为此你猫试试这个查询

    String t;
                t = (String) session.createQuery(
                        "select case when count(*)>1000000   "
                        + "then '1Million +' "
                        + "else count(*) "
                        + "end "
                        + "from events").uniqueResult();
                   session.getTransaction().commit();
    
                   System.out.println("size is " + t);
    

    使用CASE [ WHEN {test_conditional} THEN {match_result} ]* ELSE {miss_result} END https://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html/ch11.html#d5e3280

    【讨论】:

    • 感谢您的建议。查询的性能与计算整个表的性能相同。我的目标是在达到 1M 时停止计数
    猜你喜欢
    • 2012-06-20
    • 2013-05-10
    • 2011-02-17
    • 1970-01-01
    • 2013-11-09
    • 2013-07-24
    • 2011-04-08
    • 1970-01-01
    • 2016-05-09
    相关资源
    最近更新 更多