【问题标题】:Get count of results from hibernate select query (query returning an object not Select count(*))从休眠选择查询中获取结果计数(查询返回的对象不是选择计数(*))
【发布时间】:2017-10-08 17:22:30
【问题描述】:

我有一个 HQL 查询

String q = "From TMainTable where a= ? and b= ? and c=?"
Query q = session.createQuery(q).setParameter(0,1).setParameter(1,2).setParameter(2,3);
int count = getCount(q);
List<TMainTable> list = q.setFirstResult(pageNo).setMaxResults(maxLimit).list()

public int getCount(Query q){
   return q.list().size();
}

但是 getCount 方法花费了很多时间。假设我的表有 10000 行,而我一次只得到 20 条记录的实际计数。使用 Query 对象获取计数的最快方法是什么。

我已经在 getCount 函数中尝试过这个

public Long getCount(Query q){
String queryString = q.getQueryString();
            String countQueryString = "Select count(*) From "+queryString.substring(0, q.getQueryString().indexOf(" From"));
            System.out.println(countQueryString);
            Long c= (Long)ctx.getSession().createQuery(countQueryString).uniqueResult();
return c;
}

但是如何在新查询中设置参数?有没有办法只更改查询对象中的查询字符串。

【问题讨论】:

  • 不清楚:标题中有“(查询返回对象不选择计数(*))”你的意思是你不能使用计数查询?
  • 是的,我在 getCount 函数中只有查询对象。我可以获取查询字符串并对其进行更改以进行计数查询,但我还是不知道如何构建新查询
  • 所以...如果您实际上可以获取查询并替换它...只需进行自己的查询并完成它?这就像拿一把锤子剪东西,当你可以抓住一把剪刀时尝试磨它
  • 是的。我刚刚编辑了问题并添加了我想要做的事情。在 Query 对象中,我需要单独编辑查询字符串

标签: java mysql hibernate


【解决方案1】:

您必须设置以 1 开头的参数而不是 0 :

Query q = session.createQuery(q).setParameter(0,1).setParameter(1,2).setParameter(2,3);
//--------------------------------------------^-----------------^-----------------^

相反,您必须使用:

Query q = session.createQuery(q).setParameter(1,1).setParameter(2,2).setParameter(3,3);
//--------------------------------------------^-----------------^-----------------^

第二次获取列表的大小,您可以像这样使用getResultList().size

public int getCount(Query q){
   return q.getResultList().size();
}

【讨论】:

  • 我正在做一个 q.list().size() 当我的数据更多时它非常慢
【解决方案2】:

你应该看到hibernate生成了什么样的sql。它可能非常低效。如果是这样,您应该编写本机 sql 查询。

【讨论】:

    【解决方案3】:

    通常,您将有两个查询,一个用于正式执行 count(*),第二个用于实际查询。主查询获得结果数量的唯一方法是完全执行,然后对结果列表进行计数,这将非常慢。

    【讨论】:

      【解决方案4】:

      试试这个:

        Query query = session.createQuery("select count(*) from Class_NAME as a where YOUR_CONDITION");
              try {
                  return Integer.valueOf(String.valueOf(query.uniqueResult()));
              } catch (Exception e) {
                  //Print stacktrace
                  return 0;
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多