2016-04-30 8 views
2

私は、hibernate-java8アドオンでhibernate 5を使用してLocalDateTimeフィールドを使用しています。今私は、単に特定の時間範囲内のユーザーのすべてのトランザクションを照会するHibernate:範囲を照会するためにLocalDateTimeを使用する

@Entity 
public class Transaction { 
    // ... 
    private User user; 
    private LocalDateTime date; 
    // .. 
} 

:私は今のように日付フィールドを持つエンティティとユーザーフィールドを持っています。だから私は、次のクエリを使用します。十分な

SELECT t FROM Transaction t WHERE t.user = :owner AND t.date BETWEEN :from AND :to 

奇妙なこのクエリは私に何も結果を与えるものではありません。私はまた、<>演算子を使ってみましたが、どちらも役に立たなかった。時間範囲の部分を省略すると、ユーザーのトランザクションの正しい一覧が表示されます。 MySQLワークベンチでHibernateによって生成されたSQLクエリを実行すると、期待される結果も得られます。これは、単にクエリは、上記の提供

public <T> List<T> findList(Class<T> type, String queryName, 
     Map<String, Object> params) { 
    final EntityManager em = this.entityManager.get(); 
    final TypedQuery<T> query = em.createNamedQuery(queryName, type); 
    params.forEach(query::setParameter); 
    return query.getResultList(); 
} 

と呼ばれるなど、名前付きパラメータのマップ:持続私のテストケースで

findList(Transaction.class, Transaction.BY_USER_AND_RANGE, 
      ImmutableMap.of("owner", owner, "from", from, "to", to)); 

私は(名前の)クエリを実行するには、次のスニペットを使用します現在の日付との1つのトランザクションで、クエリの昨日から明日までの範囲を作成しました。 MySQLワークベンチのテーブルを調べると、トランザクションが存在し、日付フィールドに正しいタイプがあり、正しい値が入っていることがわかります。しかし、私のクエリは私に結果を与えません。

紛失しているものはありますか?

+2

を助けるかもしれないからとの値は何ですか?からの論理的な説明はより大きい場合。または、あなたの日付がそれらの間にないこと。 –

答えて

2

あなたはのparamとして渡している日も

する必要がありますLocalDateTimeを は、以下の例のコードを参照してくださいあなたの

LocalDate date = LocalDate.of(2015, 8, 11); 
TypedQuery<MyEntity> query = this.em.createQuery("SELECT e FROM MyEntity e WHERE date BETWEEN :start AND :end", MyEntity.class); 
query.setParameter("start", date.minusDays(2)); 
query.setParameter("end", date.plusDays(7)); 
MyEntity e = query.getSingleResult(); 
関連する問題