我正在尝试通过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
,c1
和c2
的父项c3
,并且只有c1
和c2
的ID传递给您的方法。如果仅使用Parent
和c1
来获取c2
实体,那么如果执行以下操作,会发生什么:
p = parentRepo.getParentByIdAndChildIds(1, Arrays.asList(1,2));
p.getChildren().add(c3);
parentRepo.save(p); // what happens?
创建新子代没有意义,因为数据库中已经存在一个子代。另一方面,jpa的默认行为是在保存时无需修改即可删除p
和c3
之间的关系:
p = parentRepo.getParentByIdAndChildIds(1, Arrays.asList(1,2));
parentRepo.save(p); // is the relationship between p and c3 destroyed
考虑创建双向关系(也从Child
到Parent
)并仅获取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
实体,而且从任何Parent
(Child
)都可以访问children.get(0).getParent()
。