gpt4 book ai didi

java - JPQL Left Join - 如何在实体类中设置实体关系

转载 作者:行者123 更新时间:2023-12-02 06:53:37 25 4
gpt4 key购买 nike

两个表:

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 等中进行选择

如何修改实体类和 JPQL 查询以获得与 SQL 查询相同的结果?我一直在尝试各种方法,但没有任何效果。它不允许我创建两个具有相同列名的字段,或者将字符串定义为@JoinColumn。我几乎让它工作,但生成的 SQL 查询包含对 TABLE_2 中不存在的 REC_ID_REC_ID 列的引用。在谷歌搜索了这么多之后,我找不到合适的指南(忽略 JPQL 不支持内联连接条件!)

最佳答案

您需要在实体之间建立一对一关联。并且关联,在拥有方,必须使用 @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 ...

关于java - JPQL Left Join - 如何在实体类中设置实体关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17698229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com