有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java获取hibernate select查询的结果计数(返回对象的查询未选择计数(*))

我有一个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条记录。使用查询对象获取计数的最快方法是什么

我在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) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    试试这个:

      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;
            }
    
  3. # 3 楼答案

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

  4. # 4 楼答案

    必须设置以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();
    }