0

UserTypeJavaクラスとJDBCの間で型変換を行うHibernateを作成しVARCHARました。Beanに次のように注釈を付けました。

@TypeDef...
class MyClass {
    @Column(name = "...")
    @Type(type = "MyPropertyType")
    private MyProperty myProperty;

    @Column(name = "...")
    private Date date;
}

これで、ユーザーはコマンドラインを介してこのプロパティ(およびその他)の条件を指定できます。JPAを使用して、これらの条件をクエリに追加しますCriteriaBuilder。次に例を示します。

criteriaBuilder.equal(column, operand);

そうすることで、Hibernateはoperand(文字列である)がに対応しないと文句を言いMyProperty.classます。Hibernateは型を自動的に変換しようとしません(これは、ターゲット型を認識しており、実装する型を指す注釈が付いているためStringRepresentableTypeです。したがって、型変換を手動で行う必要があります。

  • 文字列をターゲットタイプに変換しようとするようにHibernateに明示的に指示することは可能ですか?または、Hibernateから特定のBeanプロパティのTypeインスタンスを取得できますか?
  • 登録さTypeRegistryれているHibernateはどこで入手できますか?MyPropertyType
4

1 に答える 1

0

解決策は、文字列をターゲットタイプに変換する2番目の変換サービスを作成することです。Springの変換機能を使用しています:

@Resource
ConversionService conversionService;

// ...

Object castedOperand = conversionService.convert(operand, column.getJavaType());

Hibernateは次castedOperandのような条件で受け入れるようになりました

criteriaBuilder.equal(column, operand);

VARCHAR最初の変換機能(Hibernate)はJDBC(eg )とJavaタイプの間で変換し、2番目の変換機能(Spring)はユーザー入力(コマンドラインまたはHTTP要求からの文字列)とJavaタイプの間の変換を実行するため、これは一般的に理にかなっています。

を実装するクラスを含め、HibernateからTypeRegistrySpringに既存のコンバーターを注入する方法がある場合は、コメントを残してください。ConversionServiceStringRepresentableType

于 2012-12-21T19:22:19.773 に答える