1

2 つのクラスを持つ JPA モデルを使用しています。1 つ目は「動的」データを使用してテーブルをマッピングし、2 つ目は読み取り専用の参照データを使用してテーブルをマッピングします。

例として、Personエンティティへの @OneToOne 参照を含む Person テーブルをマッピングするCivilityエンティティがあり、それ自体が 3 つのレコード (Miss、Mrs、Mr) のみを持つ Civility テーブル (2 列) にマップされます。

Civility 値に基づいて person エンティティにクエリを作成する最良の方法を知りたいと思っていました。たとえば、Civility = Mr? を持つすべての Person を取得するには、どのようなクエリを使用すればよいでしょうか?

ありがとう。

4

2 に答える 2

1

参照ルックアップ データをマップする 1 つの方法は、jpa で @Enumerated アノテーションを使用することです。ルックアップ値を使用して列挙を作成する必要がありますが、それがとにかく参照データである理由です。

たとえば、評価コードがあり、テーブルに文字列/varchar 値があります。ただし、列挙を使用して使用できます。

@Enumerated(EnumType.STRING)
@Column
public RatingCode getRating() {
  return rating;
}
public void setRating(RatingCode rating) {
   this.rating = rating;
}

列挙は次のとおりです。

public enum RatingCode {
    Core, Star
}

単体テストを使用してすべての値を試すと、参照データを取得する安全な方法であることがわかります。

引き続き HQL を使用して値を取り出し、列挙を値として渡すことができます。

hql = "select r from Rating as r where r.rating = :aEnum"

// and in the call to pass the parameter
qry.setParameter("aEnum", aRatingCode)

列挙は、Rating エンティティ内のフィールドです。

@Entity
@Table
public class Rating {

    private Integer rating_Id;

    private RatingCode rating;

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column
    public Integer getRating_Id() {
        return rating_Id;
    }
    public void setRating_Id(Integer rating_Id) {
        this.rating_Id = rating_Id;
    }

    @Enumerated(EnumType.STRING)
    @Column
    public RatingCode getRating() {
        return rating;
    }
    public void setRating(RatingCode rating) {
        this.rating = rating;
    }

}

評価を必要とするプロファイルがあるので、列挙を介して評価を検索し、それをプロファイルに追加します。

Profile p = new Profile();
RatingServiceI rs = new RatingService()
Rating r = rs.getRating(RatingCode.Core);
p.setRating(r);
于 2012-05-24T15:58:29.687 に答える
0

エンティティ定義を投稿していないため、この回答のコードを解釈して、実際のモデルと一致させる必要があります。また、この場合、エンティティ自体のクエリは、基になるテーブルのデータが「読み取り専用」であるかどうかに関係なく、何もしないことに注意してください。

final String queryStr = "SELECT p FROM Person p WHERE p.civility.value = :value";
final TypedQuery<Person> query = entityManager.createQuery(queryStr, Person.class);
query.setParameter("value", "Mr");
List<Person> results = query.getResultList();
于 2012-05-24T15:56:48.730 に答える