_SELECT x FROM SomeClass
WHERE x.dateAtt BETWEEN CURRENT_DATE AND (CURRENT_DATE + 1 MONTH)
_
上記のJPQLステートメントでは、SomeClassにmembr dateAttr
があり、これは_Java.util.Date
_であり、@Temporal(javax.persistence.TemporalType.DATE)
アノテーションが付いています。
_(CURRENT_DATE + 1 MONTH)
_ビットを実行する方法が必要です。現在の状態では明らかに間違っていますが、JPQLの日付関数を含むドキュメントが見つかりません。
ドキュメントJPQL日付関数(およびこの特定のクエリを実行する方法)というドキュメントの方向に誰かが私を向けることはできますか?
+ 1か月の日付オブジェクトがある場合は、次のようにすることができます。
public List findEmployees(Date endDate) {
return entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2")
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,endDate, TemporalType.DATE).getResultList();
}
ただし、これには事前に日付が有効であることが必要です。
[〜#〜]更新[〜#〜]
常に翌月が必要な場合は、 JodaTime を使用できます。その後、次のようにクエリを変更できます。
//Get next month
DateTime dt = new DateTime();
entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2")
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,dt.plusMonths(1).toDate(), TemporalType.DATE).getResultList();
標準のJPQLでは、日付に対するこのような操作はサポートされていません。ネイティブクエリを使用するか、Java側で計算を行う必要があります。
または、jodatimeの代わりにcommons-langを使用します。
entityManager.createQuery(
"SELECT e from Employee e WHERE e.startDate BETWEEN ?1 AND ?2"
)
.setParameter(1,new Date(), TemporalType.DATE)
.setParameter(2,DateUtils.addMonths(new Date(), 1), TemporalType.DATE)
.getResultList();
しかし、これはあなたが求めているものではないことを知っています。JPQLだけではそれができないと確信しています。パラメータを渡すか、ネイティブの名前付きクエリを使用する必要があります。
親愛なる、
私は春のデータを使用しています、エンティティはcreatedDateをdatetimeとして保存し、次のようにリポジトリに保存します。
@Query(value="SELECT t FROM MyEntity t WHERE t.createdDate Between ?1 and ?2")
public List<MyEntity> findAllBetweenDates(Calendar from, Calendar to);
だから私は使用できません:
setParameter(1,new Date(), TemporalType.DATE
バックエンドBeanでは、次のように使用します。
//to set zero of hours,minutes,seconds and milliseconds
fromCalendar.set(Java.util.Calendar.HOUR, 0);
fromCalendar.set(Java.util.Calendar.MINUTE, 0);
fromCalendar.set(Java.util.Calendar.SECOND, 0);
fromCalendar.set(Java.util.Calendar.MILLISECOND, 0);
toCalendar.set(Java.util.Calendar.HOUR, 0);
toCalendar.set(Java.util.Calendar.MINUTE, 0);
toCalendar.set(Java.util.Calendar.SECOND, 0);
toCalendar.set(Java.util.Calendar.MILLISECOND, 0);
// add 1 days and decrease 1 millisecond
toCalendar.add(Java.util.Calendar.DAY_OF_MONTH, 1);
toCalendar.add(Java.util.Calendar.MILLISECOND, -1);
allEntities = myEntityRepository.findAllBetweenDates(fromCalendar, toCalendar);
}
そしてそれはうまく働いています。