Как объединить выборку только выбранных дочерних объектов с родительской сущностью - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь выбрать только определенные объекты рядом с родителем по идентификаторам. Это возможно? Пример (шаблон отсутствует):

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 дочерних объекта, но вместо этого я получаю ВСЕХ детей (т.е. детей с идентификаторами от 1 до 10).

1 Ответ

1 голос
/ 31 марта 2020

Это не имеет никакого смысла, потому что весь граф сущностей должен быть выбран. Представьте, что у родителя p есть дети c1, c2 и c3, и в ваш метод передаются только идентификаторы c1 и c2. Если вы выбираете сущность 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()).

...