2011-08-03 37 views
2

私はdateTimeの型の列を持つテーブルを持っています(私はSQL Serverを使用しています)。私は、dateTime列でテーブルを照会したいと思います。 dateTime列に同じ日付またはそれ以降の行が必要ですが、日付をパラメータとして渡したいとします。要するに、dateTimeは指定された日付以上でなければなりません。JPA CriteriaBuilderで時間型を指定する方法は?

問題は、基準APIを使用してDateオブジェクトを使用してクエリを実行しようとすると、翌日からの行しか提​​供されないということです。私はそれが同じミリ秒またはそれ以降の行を見つけることを試みると思っています。 JPAクエリ言語では、パラメータの一時的な型(setParameter( "dateColumn"、myDate、Temporal.DATE))を指定できますが、CriteriaBuilder APIで類似のものは見つかりません。助言がありますか?私はDataNucleusのJPA

@Entity 
public class A 
{ 
    @Id 
    Long id; 

    @Temporal(TemporalType.DATE) 
    Date date; 
} 

と以下のクラスを実行する場合、これはDATE列に格納されている日付を持っているまあ

cb.greaterThanOrEqualTo(r.<Date>get(fieldName), beginDate)); 
+0

どれ実装が「dateColumn」が指定されている方法を知って、それに応じてクエリを生成する必要があります。だから、生成されたSQLをプリントアウトしないのはなぜですか? – DataNucleus

+0

生成されたSQLは次のようなものです:dateColumn> =?1 org.hibernate.typeのロギングを有効にすると、このパラメータは実際には日付であることがわかります。問題は、日付オブジェクトが時間、分、秒、およびミリ秒も含むため、日付オブジェクトがあまりにも「正確」であることです。私は日付から不要な部分を削除して修正することができましたが、JPA CriteriaBuilderを使って自動的に行うことができるかどうかは不思議でした。 – palto

答えて

1

私は答えが得られていないので、プログラムではなくプログラマチックな方法があると仮定するつもりです応用。

月曜日以降に作成されたエンティティのクエリを作成する場合は、Dateオブジェクトを作成し、日付を月曜日に設定し、Dateオブジェクトから時間、分、秒、およびミリ秒をクリアする必要があります。 Apache Commons Langライブラリには、このような状況のために、DateUtilsというヘルパークラスがあります。これは、CriteriaBuilderでgreatedThanOrEqualを使用できるように、Dateオブジェクトから不要な精度を取得するために使用できるtruncateメソッドを持っています。

0

私のコードは、現在、このようになります。そして次に(時間/分/秒を含む)のパラメータとしてjava.util.Dateを渡す次のクエリ

SELECT a FROM A a WHERE a.date >= :myDate" 

を実行し、それが

SELECT 'org.datanucleus.test.A' AS NUCLEUS_TYPE,A."DATE",A.ID,A."NAME" FROM A A WHERE A."DATE" >= <2009-06-15> 

< 2009-のクエリを作成します06-15>はJDBCのパラメータです(山括弧はこれを示すためにのみ表示されています)。問題はありません。つまり、JPA仕様の意味するものの型に一致すると解釈します起こるはずです)

明らかに、Hibernateがあなたがjava.sql.Dateを渡してHibernateのバグを起こす可能性があるという問題

+0

申し訳ありませんが、私が聞いたことは、あなたの答えから実際には逆です:)。エンティティAの日付属性はTemporaltType.TIMESTAMPになります。私は、クエリに与えているパラメータにTemporalType.DATEがあると言う方法があるかどうかを知りたいと思うでしょう。 – palto

+0

フィールドをTIMESTAMPとして指定すると、すべての標準JPQLと基準を格納するため、JPQLは常に完全な日付を使用します。だから、java.sql.Dateを渡すだけです – DataNucleus

1

あなたはParameterExpressionを使用することができます。

ParameterExpression<Calendar> beginDateParameter = cb.parameter(Calendar.class); 
... 
... 
criteriaQuery.select(...) 
    .where(criteriaBuilder.equal(r.get(fieldName), beginDateParameter)); 

entityManager.createQuery(criteriaQuery) 
    .setParameter(beginDateParameter, beginDate, TemporalType.DATE) 
    .getResultList(); 

Hibernateのログを日付が日時として渡されていることを示しています

TRACE: org.hibernate.type.descriptor.sql.BasicBinder - binding parameter [0] as [DATE] 
関連する問題