我正在进行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;
}
但是如何在新查询中设置参数?有没有办法可以只更改查询对象中的查询字符串。
答案 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;
}