0

2 つのテーブル:

TABLE_1:
REC_ID
1
2
3
4

TABLE_2:
REC_ID REC_VAL
2      A
3      B

エンティティ クラス (基本構造):

@Entity
@Table(name="TABLE_1")
public class Entity1 {
    @Id
    @Column(name="REC_ID")
    private String recId;

    //getters and setters
}

@Entity
@Table(name="TABLE_2")
public class Entity2 {
    @Id
    @Column(name="REC_ID")
    private String recId;

    @Column(name="REC_VAL")
    private String recVal;

    //getters and setters
}

SQL クエリと結果:

SELECT T1.REC_ID, T2.REC_VAL FROM TABLE_1 T1 LEFT OUTER JOIN TABLE_2 T2 ON T1.REC_ID = T2.RED_ID

Result:
REC_ID REC_VAL
1      null
2      A
3      B
4      null

JPQL クエリ:

SELECT e1.recId, e2.recVal FROM Entity1 e1 LEFT JOIN e1.<an Entity2 field in Entity1*>

* 上記の構造に含まれていないことはわかっていますが、正しく行う方法を知りたいです。@ManyToOne、@OneToOne などから選択するにはどうすればよいですか。

Entity クラスと JPQL クエリを変更して、SQL クエリと同じ結果を得るにはどうすればよいですか? いろいろ試しているのですが、うまくいきません。同じ列名で 2 つのフィールドを作成したり、文字列を @JoinColumn として定義したりすることはできません。ほとんど動作しましたが、生成された SQL クエリには、存在しない TABLE_2 の REC_ID_REC_ID 列への参照が含まれています。そして、グーグルで調べた後、これに関する適切なガイドを見つけることができません( JPQLがインライン結合条件をサポートしていないことを無視して! )

4

1 に答える 1

2

エンティティ間に OneToOne 関連付けが必要です。また、所有側の関連付けには、 の注釈を付ける必要があります@MapsId。ユースケースに対応する Hibernate のドキュメントから抜粋した例を次に示します。

@Entity
public class Body {
    @Id
    public Long getId() { return id; }

    @OneToOne(cascade = CascadeType.ALL)
    @MapsId
    public Heart getHeart() {
        return heart;
    }
    ...
}   

@Entity
public class Heart {
    @Id
    public Long getId() { ...}
}          

それができたら、次のようなクエリを使用できます

select b.foo, h.bar from Body b left join b.heart h where ...
于 2013-07-17T11:20:16.787 に答える