我正在尝试编写一段代码,以便将所有ContactDevices及其关联的Contact一次作为列表获取(通过只执行一个sql语句)。
Criteria sq = session.createCriteria(ContactDevice.class)
.setFetchMode("contact", FetchMode.JOIN);
List<ContactDevice> contactList = (List<ContactDevice>) sq.list();
问题在于每个ContactDevice
,hibernate通过运行单独的sql语句来提取它与Contact
相关联,这使得我的程序相当慢,我的意思是hibernate为每个ContactDevice
运行它得到它与Contact
:
select * from Contact contact0_ where contact0_.ContactID=?
我也尝试了一种看似更加手动的方法,但仍然无法阻止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;
}
答案 0 :(得分:1)
谢谢你们,你的提示对我帮助很大。最后我想出了一种方法,就是禁用proxy
来摆脱这种持续存在的懒惰!
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");
答案 1 :(得分:0)
尝试使用这样的简单HQL查询:
Query query = session.createQuery("select cd from ContactDevice cd join fetch cd.contact");
List list = query.list();