如何将仅提取选定的子实体与父实体连接



我试图通过id只选择父实体旁边的某些实体。这可能吗?示例(省略样板(:

class Parent {
int id;
List<Child> children;
}
class Child {
int id;
...
}

还有我的JpaRepository:

interface ParentRepo extends JpaRepo<Parent,Integer> {
@Query("SELECT p FROM Parent p JOIN p.children c WHERE p.id = :parentId and c.id IN(:childIds")
Parent getParentByIdAndChildIds(int parentId, List<Integer> childIds)
}

我的期望是呼叫:

parentRepo.getParentByIdAndChildIds(1, Arrays.asList(1,2,3))

将返回只附加了3个子实体的父对象,但相反,我得到了所有的子对象(即ID为1-10的子对象(。

这没有任何意义,因为需要提取整个实体图。考虑父p具有子c1c2c3,并且只有c1c2的ID被传递给您的方法。如果你只获取一个c1c2Parent实体,那么如果你这样做会发生什么:

p = parentRepo.getParentByIdAndChildIds(1, Arrays.asList(1,2));
p.getChildren().add(c3);
parentRepo.save(p); // what happens?

创建一个新的子项没有意义,因为数据库中已经存在一个。另一方面,jpa的默认行为是在不修改的情况下保存时删除pc3之间的关系:

p = parentRepo.getParentByIdAndChildIds(1, Arrays.asList(1,2));
parentRepo.save(p); // is the relationship between p and c3 destroyed

考虑创建双向关系(也从ChildParent(,并仅获取Child实体(从ChildRepository(:

interface ChildRepository extends JpaRepository<Child, Integer> {
@Query("SELECT c FROM Child c WHERE c.parent.id = :parentId and c.id IN(:childIds)")
List<Child> getParentByIdAndChildIds(int parentId, List<Integer> childIds)
}

这样,您不仅可以获得所需的Child实体,而且可以从任何Child(children.get(0).getParent()(访问Parent

最新更新