簡體   English   中英

從休眠選擇查詢獲取結果計數(查詢返回的對象不是選擇計數(*))

[英]Get count of results from hibernate select query (query returning an object not Select count(*))

我有一個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();
}

您應該看到hibernate生成哪種類型的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;
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM