Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 为什么SpringDataJPA在SimpleSelect上进行连接?_Hibernate_Spring Data Jpa - Fatal编程技术网

Hibernate 为什么SpringDataJPA在SimpleSelect上进行连接?

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

我有@ManyToOne链接的实体。当我在上面请求findByCity时,spring数据执行“左外连接”。但如果我在hibernate上使用eq标准执行此操作,它会收到正常的请求,比如“select….where city_id=…”。
如何避免没有@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要慢。为什么是一样的??