web-dev-qa-db-ja.com

日付のみでDateTimeをクエリするSpringデータ

私はこのデータモデルを持っています

public class CustomerModel{

  @Column
  @Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
  private DateTime membershipDate;
  //Other properties and getters
}

そして、次のレポ

public interface CustomerRepo  extends Repository<CustomerModel, Long>{}

私がやりたいのは特定の日付(2013年8月1日に参加したメンバー)のすべてのユーザーを取得しますが、問題は私のDBで、membershipDateに時間があります。時間を無視して特定の日付のすべてのユーザーを取得するにはどうすればよいですか?

12
user962206

残念ながらJodaTimeでは、これを回避する唯一の方法は、Betweenキーワードを使用し、1日を構成する2つのDateTimeインスタンスを使用することです。

_interface CustomerRepo extends Repository<CustomerModel, Long>{

  List<CustomerModel> findByMemberShipDateBetween(DateTime start, DateTime end);
}
_

ドメインモデルでJava Datesを内部で使用している場合、このスタイルを使用できます。

_interface CustomerRepo extends Repository<CustomerModel, Long>{

  List<CustomerModel> findByMemberShipDate(@Temporal(TemporalType.DATE) Date date);
}
_

_@Temporal_アノテーションは、Spring Data JPAのカスタムアノテーションではありません。プレーンなJPAアノテーションは現在、パラメーターでは許可されていません。これがJava Datesでのみ動作する理由は、残念ながら現在のJPAPIの制限です。QuerysetParameter(…)メソッドは、 TemporalType型のパラメーターのDate。パラメーターバインディングでJodaTimeオブジェクトを変換することもできますが、型の不一致(Date VS. DateTime)。

33
Oliver Drotbohm

いくつかの回避策を実行できます:たとえば、DateTime dayBeginおよびDateTime dayEndを作成します。 2013-07-04 00:00:00および2013-07-04 23:59:59およびクエリにより必要なオブジェクトを取得します:

List<CustomerModel> findByMembershipBetween(DateTime dayBegin, DateTime dayEnd);
4
yname

jODAとspring&JPAは実際には良い友達です。

http://blog.netgloo.com/2015/04/06/spring-boot-using-joda-time-on-jpa-entity-with-hibernate/

楽しい

3
Robocide