2010-11-23 16 views
10

次のコードを使用して、MySQLテーブルからExperienceオブジェクトのリストを取得しようとしています。各エクスペリエンスはdatetimeの列とdatetimeの列からなり、今日の日付がfromとtoの間にある行だけをプルします。JPA/Hibernate Criteriaを使用して日付を取得する

私は、Hibernateを使い果たすJPA 2.0を使用しています。

私の問題は、builder.between()は明らかに私がDateオブジェクトを渡すことを許さないということです。

私の問題に対して、より良い解決策がありますか?

答えて

19

あなたは、それをパラメータとして渡すことができます。

ParameterExpression<Date> d = builder.parameter(Date.class); 
builder.between(d, root.<Date>get("from"), root.<Date>get("to")); 
return entityManager.createQuery(query) 
    .setParameter(d, currentDate, TemporalType.DATE).getResultList(); 

注意をこの場合には、希望の時間タイプを指定する必要があること。

また、データベースの現在の日付に依存することができます:など

+1

ありがとう - それは完璧です。私の問題は、何らかの理由でroot.get( "from")がPathオブジェクトであり、Expressionオブジェクトではないことです。 – christophmccann

+0

@Christopher: 'Path'は' Expression'のサブタイプです。 – axtavt

+0

root.get()から返されるオブジェクトは、Dateではない汎用スーパータイプオブジェクトです。しかし、最初のパラメーターは汎用スーパータイプ日付です。 3つとも同じスーパータイプでなければなりません。何か案は? – christophmccann

2

このリンクは有望に見える:http://www.javalobby.org/articles/hibernatequery102/

あなたはサンタクロース

の間で作成することcriteria.ge("date", root.get("from"));criteria.le("date"), root.get("to"));を使用することができるものは利用できない場合は、HQLを書くことを検討する必要がある場合があります。

+1

フォーマットされたビット、それは今より良く見える –

6

builder.currentDate()builder.currentTimestamp()、あなたの引数を切り替える必要があります。

builder.between(root.<Date>get("dateColumn"), startDate, endDate); 
8

あなただけの)CriteriaBuilder.literal(への呼び出しを逃しています。

Date currentDate = new Date(); 
CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Experience> query = builder.createQuery(Experience.class); 
Root<Experience> root = query.from(Experience.class); 
builder.between(builder.literal(currentDate), root.get("from"), root.get("to")); 
return entityManager.createQuery(query).getResultList();