web-dev-qa-db-ja.com

Java:期間を別の日付に追加するJPQL日付関数

_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日付関数(およびこの特定のクエリを実行する方法)というドキュメントの方向に誰かが私を向けることはできますか?

26
bguiz

+ 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();
18
Shervin Asgari

標準のJPQLでは、日付に対するこのような操作はサポートされていません。ネイティブクエリを使用するか、Java側で計算を行う必要があります。

18
Pascal Thivent

または、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だけではそれができないと確信しています。パラメータを渡すか、ネイティブの名前付きクエリを使用する必要があります。

5

親愛なる、

私は春のデータを使用しています、エンティティは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);
}

そしてそれはうまく働いています。

0
Hazim