Hibernate 一次获取两个联接表的所有行

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

我正在尝试编写一段代码,以一次获取所有ContactDevices及其关联联系人作为列表(通过只执行一条sql语句)

我还尝试了一种看起来更手动的方法,但仍然无法阻止hibernate,有没有任何方法可以通过只运行一条sql语句来实现这一点

@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");