エンティティに2つの日付があります。すなわち。
_Date startDate;
Date endDate;
_
日付を指定すると、指定された日付がstartDate
とendDate
の間にあるすべてのエンティティを返すようにクエリするにはどうすればよいですか?
私はすでに以下を試しました:
_findByStartDateAfterAndEndDateBefore(Date givenDate);
_
そして、Spring-Data-JPAはこれを好まず、エラーに遭遇しました。特定のエラーはなく、レポはクラスに挿入できません。
正しい方法は何ですか?これは、Hibernate基準またはNative SQLを使用して簡単に実行できますが、Spring JPAでそれを実行しようとしています。
これはクエリ自体に問題があるのですか、それともSpringが使用する日付型間の何らかの非互換性ですか?
findByStartDateAfterAndEndDateBefore(Date givenDate, Date givenDate)
を試しましたが、nullを返します。
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 を使用します。
驚いたことに、LessThan
とGreaterThan
が機能し、Before
とAfter
がひどく失敗しました。
日付に「より小さい」と「より大きい」を使用できるとは考えず、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
で日付を処理するためのクリーンな方法がなければならないと思いますが、私はそれを理解することができません。
誰かがそれを理解したら素晴らしいでしょう。
JPAクエリでAND
条件を使用していますが、パラメーターを1つだけ提供しています。 findByStartDateAfterAndEndDateBefore(Date startDate, Date endDate);
のように使用する必要があります
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日だけ戻します。
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;
}
私はこのような問題なくそれを使用します:
findAllByEntityNotNullAndDateBetween(Date begin, Date end);
すでに試しましたか?