Hibernate 一次获取两个联接表的所有行
我正在尝试编写一段代码,以一次获取所有ContactDevices及其关联联系人作为列表(通过只执行一条sql语句) 我还尝试了一种看起来更手动的方法,但仍然无法阻止hibernate,有没有任何方法可以通过只运行一条sql语句来实现这一点Hibernate 一次获取两个联接表的所有行,hibernate,jpa,join,Hibernate,Jpa,Join,我正在尝试编写一段代码,以一次获取所有ContactDevices及其关联联系人作为列表(通过只执行一条sql语句) 我还尝试了一种看起来更手动的方法,但仍然无法阻止hibernate,有没有任何方法可以通过只运行一条sql语句来实现这一点 @Entity public class Contact { @Id @Column(name = "ContactID") private Integer id; private String firstName; private Stri
@Entity
public class Contact {
@Id
@Column(name = "ContactID")
private Integer id;
private String firstName;
private String secondName;
private String avatarPath;
}
@Entity
public class ContactDevice {
@Id
@OneToOne
@JoinColumn(name = "ContactID", referencedColumnName = "ContactID")
private Contact contact;
private String phoneNumber;
private String deviceType;
}
尝试以下简单的HQL查询:
Query query = session.createQuery("select cd from ContactDevice cd join fetch cd.contact");
List list = query.list();
谢谢你们,你们的提示帮了我很大的忙。最后我想出了一个办法,那就是禁用
代理
,以摆脱这种持续的懒惰
public class ContactDevice {
@Id
@OneToOne
@LazyToOne(LazyToOneOption.NO_PROXY)
@JoinColumn
private Contact contact;
.....
}
现在元组可以通过这两种方法进行检索
Criteria sq = session.createCriteria(ContactDevice.class).setFetchMode("contact", FetchMode.JOIN)
或
setFetchMode
有一个输入错误。应该是contract
(小写)@orid将其更改为setFetchMode(“contact”,FetchMode.JOIN)
,没有帮助,如果在@OneToOne中添加fetch=FetchType.EAGER
,我添加了@OneToOne(fetch=FetchType.EAGER)
@FetchMode.JOIN),但效果相同。谢谢@Vlad,但是运行query.list()
时,仍然运行一个单独的sql来获取关联的contactdevice.contact
。您不认为问题是因为外键与主键(在contactdevice
中)相同吗?如果它运行单独的查询,那么它就是一个休眠错误。也许你错过了fetch关键字。
public class ContactDevice {
@Id
@OneToOne
@LazyToOne(LazyToOneOption.NO_PROXY)
@JoinColumn
private Contact contact;
.....
}
Criteria sq = session.createCriteria(ContactDevice.class).setFetchMode("contact", FetchMode.JOIN)
Query query = session.createQuery("select cd from ContactDevice cd join fetch cd.contact");