Hibernate 为什么SpringDataJPA在SimpleSelect上进行连接?
我有@ManyToOne链接的实体。当我在上面请求findByCity时,spring数据执行“左外连接”。但如果我在hibernate上使用eq标准执行此操作,它会收到正常的请求,比如“select….where city_id=…”。Hibernate 为什么SpringDataJPA在SimpleSelect上进行连接?,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,我有@ManyToOne链接的实体。当我在上面请求findByCity时,spring数据执行“左外连接”。但如果我在hibernate上使用eq标准执行此操作,它会收到正常的请求,比如“select….where city_id=…”。 如何避免没有@Query的连接?默认情况下,使用@manytone关系的select始终根据定义使用连接。在Hibernate 5标准中,您需要显式地定义它,并为每个联接创建一个别名: 因此,不要写(人->地址): session.createCriteria
如何避免没有@Query的连接?默认情况下,使用
@manytone
关系的select始终根据定义使用连接。在Hibernate 5标准中,您需要显式地定义它,并为每个联接创建一个别名:因此,不要写(人->地址):
session.createCriteria(Person.class)。
.添加(限制条件eq(“地址序列号”,“42”));
我们需要写作
session.createCriteria(Person.class)。
.createAlias(“地址”、“adr”);
.添加(限制条件(adr.序列号,42”);
createAlias似乎不是一个完美的方法名,因为它的作用是:
加入关联,为已加入的关联指定别名
但是,如果要执行简单的选择操作,也有一个变通方法,即通过一个ID选择一个对manytone关系有限制的实体,而不使用JOIN(既不在HQL中,也不在生成的SQL中)
我们可以使用address\u id
列,而不是在前面的示例中使用连接:
session.createCriteria(Person.class)。
.添加(限制条件eq(“地址”,“42”));
如果您指定一个附加的adressId
字段,该字段仅用作Hibernate的映射信息,则此选项有效:
@实体
@访问权限(AccessType.FIELD)
公共阶层人士{
@身份证
字符串id;
@JoinColumn(name=“address\u id”)
@manytone(fetch=FetchType.LAZY)
@可空
公共地址;
@列(name=“address\u id”,insertable=false,updateable=false)
私有字符串地址;
}
@实体
@访问(字段)
公共类地址{
@身份证
字符串id;
}
不需要
AccessType.FIELD
(但我们可以在示例中保留getter/setter)。FetchType.LAZY
和@Nullable
也是可选的,但是在使用它有意义时要明确。我们能够加载具有特定地址的个人
实体(我们知道地址id)。但是我们不需要连接,因为WHERE子句和初始获取都不需要连接(地址可以延迟获取)。基本相同。。;在这两种情况下都发布一些代码和生成的SQL。@VictorViola我看到使用join比不使用join要慢。为什么是一样的??