【发布时间】:2016-08-31 02:01:32
【问题描述】:
我在对与另一个具有一对一关系的实体执行 jpql 查询时遇到意外行为。关键是,关系是从根实体的主键到目标实体的一个字段,而不是ID。
示例如下:
// root entity
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@Column(name = "PERSON_ID")
private long id;
private String name;
@OneToOne(optional = false)
@JoinColumn(name = "PERSON_ID", referencedColumnName = "PERSON_ID", insertable = false, updatable = false, unique = true)
private Address mainAddress;
...
}
// referenced entity
@Entity
@Table(name = "ADDRESS")
public class Address {
@Id
@Column(name = "ADDRESS_ID")
private long id;
@Column(name = "PERSON_ID")
private long personId;
...
}
以下jpql查询:
select p from Person p left join fetch p.mainAddress
产生以下 ORACLE SQL 查询:
SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON p.PERSON_ID = a.ADDRESS_ID
虽然我期待:
SELECT ... FROM PERSON p LEFT OUTER JOIN ADDRESS a ON p.PERSON_ID = a.PERSON_ID
基本上 referencedColumnName = "PERSON_ID" 属性的属性被忽略,并且在主键上执行连接。
谁能解释一下为什么?
【问题讨论】:
-
我通过映射反向关系和使用mappedBy属性解决了。这样,ORM 就知道哪个是连接列。谢谢@Alan Hay
-
你找到解决办法了吗?