我有一个 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;
}
但是如何在新查询中设置参数?有没有办法我只能更改查询对象中的查询字符串。
您必须设置以 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();
}
你应该看到休眠生成了什么样的sql。它可能非常低效。如果是这样,您应该编写本机 sql 查询。
按照惯例,您将有两个查询,一个用于正式执行 count(*(,另一个用于实际查询。主查询获取结果数的唯一方法是完全执行,然后对结果列表进行计数,这将非常慢。
试试这个:
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;
}