0

このようなことをする方法はありますか?私は人と呼ばれるエンティティを持っています。

@Entity
@Table(name = "PERSON")
public class Person {
   @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
   String name;
   @Column(name = "NATIONALITY", length = 128, columnDefinition = "VARCHAR2(128)")
   String nationality;
}

「NATIONALITY」列には数値が含まれます。すべての数値は国のコードです。「国籍」フィールドをカスタム列挙型にマップし、コードを変換するメソッド<->国を作成したいと思います。

@Entity
@Table(name = "PERSON")
public class Person {
   @Column(name = "NAME", length = 128, columnDefinition = "VARCHAR2(128)")
   String name;
   @Column(name = "NATIONALITY", length = 128, columnDefinition = "VARCHAR2(128)")
   Nationality nationality;
}

enum Nationality {
   USA, Brazil, Germany; // etc.
}

public static Nationality codeToNationality(String code);

このようなもののための休止状態の方法はありますか? 列の定義を変更できません。データベースは読み取り専用です。

達成したい 2 番目のことは、未解決の国籍コードのエンティティを除外することです。codeToNationality(...) == null のエンティティは、休止状態では見えなくなります。

私のモデル(人物、国籍)は一例です。

助けてくれてありがとう!

4

3 に答える 3

4

両方の問題:

  1. enum を一般的な文字列にマッピングし、
  2. 不明から null へのマッピング

適切なUserTypeを作成することで解決できます。

列挙型とカスタム ユーザー タイプに関するいくつかの例は、 hereから見つけることができます。カスタム型の一般的な説明は、Hibernate のドキュメントの一部です。

その他のオプションは、列挙型に特定のセッターを提供することです。これらは、データベース列にマップされる文字列値との間で変換されます。これは、このカスタム タイプがこのエンティティでのみ必要な場合に実行できます。

于 2012-07-23T09:39:20.857 に答える
0

最初の問題については、@EnumeratedJPA アノテーションを見てください。これにより、文字列が列挙型にマップされます。属性を使用する(EnumType.STRING)と、列挙値の name() をオーバーライドして、DB にある文字列を正確に返すことができるはずです。

于 2012-07-23T09:50:47.367 に答える
0

わかりました、UserType を使用して String を Nationality に変換しました。

public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner) throws HibernateException, SQLException {
   String value = rs.getString(names[0]);
   // resolve nationality
   return /nationality found/ ? /Nationality object/ : null;
}

今、私は他の問題を抱えています。解決済みの国籍のみを検索するための基準を作成するには?

私がする時

criteria.add(Restrictions.isNotNull("nationality"));

基準は、常に null ではない国籍フィールドではなく、文字列フィールドをクエリします。

Criteria は生のデータベース (Java エンティティに変換する前) で機能することを理解しています。

于 2012-07-24T12:47:44.403 に答える