2017-02-22 47 views
1

我對hibernate很新穎。所以這對你們來說可能是一個簡單的問題。 我有一個名爲BuildHistory的表。在這裏我有一個名字爲Status的列。 我想獲得狀態值爲SUCCESS的表中項目的總數。休眠查詢獲取具有特定值的列中的條目總數

UPDATE

這是我的方法,我用得到的計數。

public Object countStatus(String sql){ 
    Session session = HibernateServeletContextListner.sessionFactory_Dummy.openSession(); 
    Transaction tx = null; 

    try { 
     tx = session.beginTransaction(); 
     Query query = session.createQuery("select sum(case when bh.status = :"+sql+" then 1 else 0 end) from BuildHistory bh"); 
     tx.commit(); 
     // return query.uniqueResult(); 
    } catch (HibernateException e) { 
     if (tx!=null) tx.rollback(); 
     e.printStackTrace(); 
    } finally { 
     session.close(); 
    } 

    return 0; 
} 

回答

3

您應該能夠使用條件聚合與HQL。像下面這樣的東西應該工作:

select sum(case when bh.status = :success then 1 else 0 end) 
from BuildHistory bh 

您可以使用下面的Java代碼:

String hql = "select sum(case when bh.status = :status then 1 else 0 end) "; 
     hql += "from BuildHistory bh"; 
Query query = session.createQuery(hql); 
query.setParameter("status", "success"); 
int sum = (Integer)query.uniqueResult(); 

一個重要的這裏的一點是,我們動態地使用準備好的聲明這裏結合:status參數。在您的原始代碼中,您試圖將查詢連接在一起,這很容易出錯,並且SQL注入。

+0

那麼它會返回什麼?一個計數(整數)還是一個列表? – sreehari

+0

@sreehari這應該返回一個計數,您應該安全地將其視爲Java整數。 –

+0

我運行了下面的查詢。 Query query = session.createQuery(「Build sum(case when when bh.status =:」+ sql +「then 1 else 0 end)from BuildHistory bh」);但我收到一筆交易異常 – sreehari