Java Hibernate:对每个集合进行单独的sql查询
我有一个Person类,它有一组联系人。一切正常,我有联系人名单。然而,在日志中,我看到一个单独的查询用于读取每个人的集合。那太糟糕了。 如何使hibernate进行连接以在一个查询中读取所有数据?我使用JPA 这是person类:Java Hibernate:对每个集合进行单独的sql查询,java,hibernate,Java,Hibernate,我有一个Person类,它有一组联系人。一切正常,我有联系人名单。然而,在日志中,我看到一个单独的查询用于读取每个人的集合。那太糟糕了。 如何使hibernate进行连接以在一个查询中读取所有数据?我使用JPA 这是person类: @Entity @Table(name = "tbl1") public class PersonItem implements Serializable{ @Id @Column(name="col1") private String gu
@Entity
@Table(name = "tbl1")
public class PersonItem implements Serializable{
@Id
@Column(name="col1")
private String guid;
.....
@ElementCollection(targetClass = ContactItem.class,fetch=FetchType.EAGER)
@CollectionTable(name="tbl2",joinColumns=@JoinColumn(name="col2"))
private List<ContactItem> contacts;
....
}
这是我获取人员列表的方式:
Query query = em.createQuery("Select p from PersonItem p WHERE p.guid IN (:guids)");
query.setParameter("guids", guids);
List<PersonItem> list=query.getResultList();
试试你的亲戚。
此外,我建议在这种情况下使用@OneToMany
关系
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN) //You can use SUBSELECT as well
private List<ContactItem> contacts;
@OneToMany(mappedBy=“person”,fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)//您也可以使用SUBSELECT
私人名单联系人;
您可以阅读有关获取策略的更多信息
请从更简单的映射开始。使用复数名称和列前缀
@Entity
@Table(name = "persons")
public class Person {
@Id
@Column(name = "f_guid")
private String guid;
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
private List<Contact> contacts;
}
@Entity
@Table(name = "contacts")
public class Contact {
@Id
@Column(name = "f_guid")
private String guid;
@Column(name = "f_info")
private String info;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_person")
private Person person;
}
如果存在重复项(连接原因),则可以使用distinct
select distinct p from PersonItem p left join fetch p.contacts WHERE p.guid IN (:guids)
尝试用LAZY代替EAGER,这样您可能看不到其他查询,原因是,每当您获取Personime的单个实例时,都需要立即加载它,它有义务获取所有关联的实体。@Bilbo Baggins,但我需要立即加载它。您真的需要使用
@ElementCollection
?@JimJim2000如果需要加载它,那么Serghey的答案似乎值得一试。@v.ladynev我只是学习了hibernate,我不知道我还能如何对集合进行注释。不,它没有帮助。可能是因为我使用JPA。为什么需要@embeddeble
?它是真的需要还是可以用简单的@实体替换?我的建议是,这就是问题的原因。我只是研究JPA并尝试不同的解决方案。我认为这是符合规格的正确关系。使用@OneToMany会有什么影响?对我来说,这个例子更像是@OneToMany
关系。这也应该使@Fetch
注释起作用代码>但是结果是相同的-4个查询。如何修复它?我做了@OneToMany(fetch=FetchType.EAGER)@JoinColumn(name=“col2”)私人列表联系人代码>结果相同-4个查询。我的错在哪里?谢谢你的帮助。是的,问题出在JPQL中。所以我现在有一个问题。问题是,在结果列表中我有7个人,而在DB中我只有3个人(一个人有4个联系人,一个人有2个联系人,一个人没有联系人)。如何修复它?顺便说一下,我使用了@OneToMany(fetch=FetchType.EAGER)@JoinColumn(name=“col2”)私有列表联系人代码>是的,它有帮助。谢谢
@Entity
@Table(name = "persons")
public class Person {
@Id
@Column(name = "f_guid")
private String guid;
@OneToMany(mappedBy = "person", fetch = FetchType.EAGER)
private List<Contact> contacts;
}
@Entity
@Table(name = "contacts")
public class Contact {
@Id
@Column(name = "f_guid")
private String guid;
@Column(name = "f_info")
private String info;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "fk_person")
private Person person;
}
select p from PersonItem p left join fetch p.contacts WHERE p.guid IN (:guids)
select distinct p from PersonItem p left join fetch p.contacts WHERE p.guid IN (:guids)