0

两张表:

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 不支持内联连接条件!

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 回答