使其更具体。可以执行 HQL-SELCT 并限制ManyToOne关系,而不需要在结果SQL中加入任何连接:
而不是使用加入
session.createQuery("FROM Person person WHERE person.adress.id = 42")
我们使用可以使用adress_id
列
session.createQuery("FROM Person person WHERE person.adressId = 42")
如果您指定一个额外的adressId
字段,这将有效,该字段仅用作 Hibernate 的映射信息:
@Entity
@Access(AccessType.FIELD)
public class Person{
@Id
String id;
@JoinColumn(name = "adress_id")
@ManyToOne(fetch = FetchType.LAZY)
@Nullable
public Adress adress;
@Column(name = "adress_id", insertable = false, updatable = false)
private String adressId;
}
@Entity
@Access(FIELD)
public class Adress{
@Id
String id;
}
AccessType.FIELD
不需要(但我们可以在示例中留下 getter/setter)。FetchType.LAZY
and也是可选的@Nullable
,但在使用它时要明确说明。我们能够加载Person
具有特定Address
(我们知道地址 id)的实体。但是我们不需要连接,因为 WHERE 子句不需要连接,初始获取也不需要连接(可以延迟获取地址)。