Hy all, 我有三张桌子儿童,宠物和玩具。宠物具有儿童身份证的参考密钥,并且玩具具有狗身份证的参考密钥。 我想加载有关Child和他的宠物的所有数据,但我不想加载玩具数据
@OneToMany(mappedBy = "petEntity", fetch = FetchType.LAZY)
public Set<PetEntity> getPetEntitySet() {
return petEntitySet;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ChildId", insertable = false, updatable = false)
public ChildEntity getChildEntity() {
return childEntity;
}
同样的玩具。
加载我有的数据
List<ChildEntity> list = entityManager.createQuery(
"SELECT c FROM ChildEntity c "+
"LEFT JOIN FETCH c.petEntitySet ",
ChildEntity.class).getResultList();
return list;
但这件事给我带来了所有数据,而不只是关于孩子和他的宠物的信息。
如何抑制实体管理器只加载表中的数据,而不是在我不想要的时候进行连接
感谢您的建议
我忘了提到在这个追逐中它不仅加载所有数据,而且还返回的不仅仅是一个子元素的副本
答案 0 :(得分:2)
加载更多数据的原因是因为您使用的是关键字fetch
。这将EAGERLY
加载孩子的宠物。
只需删除fetch
,就会发生延迟加载。
<强>更新强>
我发现这实际上就是你想要的,所以请确保在所有相关的类中正确覆盖equals()
和hashCode()
,因为我假设您正在使用Set
。
通过这种方式,jpa知道如何查找重复项
第二次更新
是的,您可以在查询中轻松使用DISTINCT
。
只需在您的选择
中添加DISTINCT
即可
List<ChildEntity> list = entityManager.createQuery(
"SELECT DISTINCT c FROM ChildEntity c "+
"LEFT JOIN FETCH c.petEntitySet ",
ChildEntity.class).getResultList();
return list;