获取来自hibernate select查询的结果计数(查询返回一个对象而不是选择count(*))

时间:2017-05-10 07:27:59

标签: java mysql hibernate

我正在进行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;
}

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

4 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

试试这个:

  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;
        }