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

时间:2014-11-29 13:56:13

标签: hibernate jpa join

我正在尝试编写一段代码,以便将所有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;
}

2 个答案:

答案 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();