2017-02-22 10 views
1

私はかなり休止状態になっています。だから、これは皆さんにとっては簡単な質問かもしれません。 私はBuildHistoryというテーブルを持っています。その中に私はStatusという名前の列があります。 ステータス値がSUCCESSのテーブルのエントリの合計数を取得したいとします。取得するHibernateクエリ特定の値を持つ列のエントリの総数

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.history bh"からのbh.status =: "+ sql +" then then else 0 end)を選択します。しかし、私はトランザクション例外を取得しています – sreehari

関連する問題