簡體   English   中英

JPQL Left Join - 如何在實體類中設置實體關系

[英]JPQL Left Join - how to set up entity relationship in entity classes

兩張桌子:

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查詢相同的結果? 我一直在嘗試各種各樣的事情,沒有任何作用。 它不允許我創建具有相同列名的兩個字段,或者將String定義為@JoinColumn。 我幾乎讓它工作,但生成的SQL查詢包含對TABLE_2中REC_ID_REC_ID列的引用,該列不存在。 在Googling這么多之后,我找不到合適的指南( 忽略JPQL不支持內聯連接條件!

您需要在實體之間建立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 ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM