web-dev-qa-db-ja.com

JPA-StartDateより後およびEndDateより前のエンティティを返す

エンティティに2つの日付があります。すなわち。

_Date startDate;
Date endDate;
_

日付を指定すると、指定された日付がstartDateendDateの間にあるすべてのエンティティを返すようにクエリするにはどうすればよいですか?

私はすでに以下を試しました:

_findByStartDateAfterAndEndDateBefore(Date givenDate);
_

そして、Spring-Data-JPAはこれを好まず、エラーに遭遇しました。特定のエラーはなく、レポはクラスに挿入できません。

正しい方法は何ですか?これは、Hibernate基準またはNative SQLを使用して簡単に実行できますが、Spring JPAでそれを実行しようとしています。

これはクエリ自体に問題があるのですか、それともSpringが使用する日付型間の何らかの非互換性ですか?

findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)を試しましたが、nullを返します。

19
Suresh Atta

Spring Dataの制限のため、1つのパラメーターしか使用できませんが、次のようなコードを使用して回避できます。

List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date startDate, Date endDate);

default List<AnEntity> findByStartDateBeforeAndEndDateAfter(Date givenDate) {
    return findByStartDateBeforeAndEndDateAfter(givenDate, givenDate);
}

このコードはあなたのニーズをカバーするはずです。 Spring Boot 1.5.9でも検証しました。 spring-data-get-started example を使用します。

11
Sasha Shpota

驚いたことに、LessThanGreaterThanが機能し、BeforeAfterがひどく失敗しました。

日付に「より小さい」と「より大きい」を使用できるとは考えず、Between、Before、Afterなどの日付関連の関数を常に確認します。

これは主にドキュメントの例によるものです

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

そこで、私は Spring Data JPA のドキュメントを詳しく調べて、以下の例で何か面白いものを見つけました。

 LocalDate date = new LocalDate().minusYears(2);
 return builder.lessThan(root.get(_Customer.createdAt), date);

したがって、著者は、timeプロパティの基準lessthanを使用して、datatimeを比較します。

それで、より少ないショットとショットが与えられて、再び、より良いショットとショットが一緒に与えられました。だから私は結論を出しました

public MyDateEntity findByStartDateLessThanAndEndDateGreaterThan(Date sDate, Date eDate); 

そして、これは今のところ機能しています。そして、おそらくbefore,after,betweenで日付を処理するためのクリーンな方法がなければならないと思いますが、私はそれを理解することができません。

誰かがそれを理解したら素晴らしいでしょう。

5
Suresh Atta

JPAクエリでAND条件を使用していますが、パラメーターを1つだけ提供しています。 findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate);のように使用する必要があります

2
Hiren

LocalDateに相当するDateオブジェクトのみが必要なので、これでうまくいくはずです。

default List<AnEntity> findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(endDate);
    cal.add(Calendar.DATE, -1);
    return findByStartDateBetween(startDate, cal.getTime());
}

終了ではなく開始を含める必要があり、SQL BETWEENを含めるため、終了を1日だけ戻します。

2
coladict
    Public List<EntityClass> findData(Date startDate,Date endDate)
   {
     Query<EntityClass> _q = em.createQuery("select a.* from _tableName a 
                         where a.startDate>= :d1 AND a.endDate<= :d2");
    _q.setParameter("d1", startDate, TemporalType.DATE);
    _q.setParameter("d2", endDate, TemporalType.DATE);
    List<EntityClass> result = query.getResultList();
    em.getTransaction().commit();
    return result;
   }
2

私はこのような問題なくそれを使用します:

findAllByEntityNotNullAndDateBetween(Date begin, Date end);

すでに試しましたか?

0
fabioresner