7

休止状態で永続化された DateTime プロパティを持つエンティティがあります

@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
@Column(name = "EFF_DT")
protected DateTime effDt;

これはすべて正常に機能し、通常の spring-data-jpa 生成クエリに適しています。

カスタム ネイティブ クエリを追加しようとしています

 @Query(value = "SELECT COUNT(*) FROM wsa_circuit_state_history ch WHERE ch.eff_dt between ?1 and ?2", nativeQuery = true)
    Integer countEffDateBetween(DateTime start, DateTime end);

私が得るエラーは、これを呼び出そうとしたときです

 java.sql.SQLException: ORA-00932: inconsistent datatypes: expected DATE got BINARY

これは、エンティティにカスタム タイプ マッピングを追加する前に、通常の spring-data finder で発生したのと同じエラーです。

 @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")

spring-data-jpa/hibernate をネイティブ クエリへのパラメーターにカスタム タイプ マッピングを使用させるにはどうすればよいですか?

4

3 に答える 3

1

まさに私も同じ要件を得ました.そして、カスタムタイプを登録して休止状態にすることで解決しました.

ネイティブ クエリの場合、TypeDefs は hibernate がユーザー タイプを見つけるのに十分ではありません。タイプを見つけるにはタイプ リゾルバーが必要です。

@Query(value = "SELECT COUNT(*) FROM wsa_circuit_state_history ch WHERE ch.eff_dt between ?1 and ?2", nativeQuery = true)
    Integer countEffDateBetween(DateTime start, DateTime end);

この場合、hibernate は型リゾルバーから型 (org.joda.time.DateTime) を推測しようとします。

Type type = session.getFactory().getTypeResolver().heuristicType(typename);

DateTimeのリゾルバーがないため、デフォルトの型(シリアル化可能な型)を取得しています.DateTimeの値はその型にキャストされ、シリアル化されてDBに永続化されます.バイナリ値が大きいために失敗します.

これを解決するには、DateTime タイプを Hibernate Configuration に登録する必要があります。

configuration.registerTypeOverride(new org.jadira.usertype.dateandtime.joda.PersistentDateTime(), new String[]{"org.joda.time.DateTime"});
于 2015-07-27T07:40:57.797 に答える