2016-10-09 7 views
0

基準を使用して以下のクエリを書きたいと思います。ハイバネート基準で明確に書く

私はdistinctの行を見つけ、where句で現在の日付を使用する必要があります。どのようにこれを基準で達成できますか?

SELECT DISTINCT * 
FROM EMAIL_PROGRAM 
WHERE CURRENT_DATE >=PGM_START_DT 
AND CURRENT_DATE <= PGM_END_DT 
AND EMAIL_PGM_FLG  ='Y' 
AND EMAIL_PGM_DESC IS NOT NULL 
and RGN_CD = 'US'; 

以下は、私が適用する必要がある私のコードです。

SessionFactory factory = null; 
    Session session = null; 
    try { 
     factory = getSessionFactory(); 
     session = factory.openSession(); 

     final Criteria criteria = session 
       .createCriteria(EmailDataBean.class); 
     returnList = criteria.list(); 
    } catch (Exception e) { 
     logger.error(e.getMessage()); 
     throw new DAOException(e); 
    } finally { 
     DBUtil.close(factory, session); 
    } 
    if (logger.isInfoEnabled()) { 
     logger.info(LOG_METHOD_EXIT); 
    } 
    return returnList; 
} 

答えて

0

あなたの基準オブジェクトでは以下を使用できます。

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
0

あなたは(これは、クエリで明確なをサポートするために必要とされる)射影リストに(つまり、Hibernateのエンティティプロパティ/フィールド)ごとに列を追加し、今

//first add conditions in the where clause (you should use property names as defined in your Hbernate entities , not column names in your DB) 
criteria.add(Restrictions.ge("PGM_START_DT", startDt)); 
criteria.add(Restrictions.le("PGM_END_DT", endDt)); 
criteria.add(Restrictions.eq("EMAIL_PGM_FLG", "Y")); 
criteria.add(Restrictions.isNotNull("EMAIL_PGM_DESC")); 
criteria.add(Restrictions.eq("RGN_CD", "US")); 

ような何かを行う必要がありますデフォルトでは

ProjectionList pList = Projections.projectionList(); 
pList.add(Projections.property("PGM_START_DT"), "PGM_START_DT"); 
pList.add(Projections.property("PGM_END_DT"), "PGM_END_DT"); 
// add all the other properties (columns) and then have the Projections.distinct method act on the entire row (all the columns) 
criteria.setProjection(Projections.distinct(pList)); 

、投影を使用すると、一覧<オブジェクト[]>というより一覧<として結果を返しませんEmailDataBean>がありますが、通常は便利ではありません。それを解決するには、あなたが代わりにResultTransformer

crit.setResultTransformer(Transformers.aliasToBean(EmailDataBean.class)); 

を設定する必要があり、代わりにプロジェクションを使用して、あなたは

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

を使用することができますが、これは、データベースから個別の行をフェッチではなく、Hibernateは結果をフィルタリングしていません。 (重複を取り除く)。