延迟加载不起作用 - jpa

时间:2011-02-03 10:11:26

标签: jpa select lazy-loading distinct fetch

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;

但这件事给我带来了所有数据,而不只是关于孩子和他的宠物的信息。

如何抑制实体管理器只加载表中的数据,而不是在我不想要的时候进行连接

感谢您的建议

我忘了提到在这个追逐中它不仅加载所有数据,而且还返回的不仅仅是一个子元素的副本

1 个答案:

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