Извлечение списка родительских объектов с отфильтрованной коллекцией дочерних элементов в Spring Data JPA - PullRequest
0 голосов
/ 27 июня 2019

Итак, я застрял в этой проблеме около половины дня, поэтому мне интересно, не слишком ли я усложняю вещи.

Мое приложение имеет три различных класса объектов Java: дедушка, родитель и потомок. Каждый дедушка содержит список родителей, а каждый родитель содержит список детей. Child имеет свойство isWellBehaved, которое является логическим.

Мы используем Spring Data JPA и Hibernate для сопоставления данных с базой данных. Наше приложение содержит множество вложенных объектов и циклических связей, и мы полагаемся на прогнозы, чтобы уменьшить размер нашего запроса.

Проблема: учитывая идентификатор бабушки и дедушки, я хочу вернуть список всех родителей (в виде прогнозов). Я хочу, чтобы каждый из родителей содержал список прогнозов ребенка, но только в том случае, если ребенок хорошо себя ведет. Остальные дети в коллекции должны быть отфильтрованы из коллекции.

Какой самый простой способ добиться этого? В настоящее время мы не используем фильтры гибернации , и я не заинтересован в их внедрении, так как вряд ли они понадобятся где-либо еще (в любом случае, подойдет ли это для этой цели?). Я использовал предикаты JPA Criteria API (очень мало), но мне сложно адаптировать его к этому конкретному сценарию. собственный запрос - это путь? Я начал двигаться в этом направлении, но у меня возникают некоторые проблемы с отображением всех полей в нашу сущность Spring из-за всех вложенных зависимостей, поэтому я просто хочу убедиться, что я даже направляюсь в правильном направлении, прежде чем продолжить.

Мой (упрощенный) класс родительского объекта выглядит так:

@Entity
@Table(name="parent"
public class Parent {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="parent_id")
    Integer id;

    Integer grandparentId; 

    @OneToMany(mappedBy = "parent")
    List<Child> children;
}

Детский класс:

@Entity
@Table(name="child"
public class Child {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="child_id")
    Integer id;

    @ManyToOne
    @JoinColumn(name="parent_id")
    Parent parent;

    boolean isWellBehaved; 
}

Интерфейс родительского хранилища:

@RepositoryRestResource(excerptProjection = ParentProjection.class)
public interface ParentRepository extends JpaProjectionRepository<Parent, Integer, ParentProjection> {

    List<ParentProjection> findAllByGrandparent_Id(Integer grandpaId);
}

Ответы [ 2 ]

0 голосов
/ 28 июня 2019

Вы можете использовать @Where аннотацию hibernate на коллекции.Это будет что-то вроде

@Entity
@Table(name="parent"
public class Parent {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="parent_id")
    Integer id;

    Integer grandparentId; 

    @Where(clause = "isWellBehaved=true")
    @OneToMany(mappedBy = "parent")
    List<Children> children;
}
0 голосов
/ 28 июня 2019

Как вы сказали:

Я хочу, чтобы каждый из родителей содержал список прогнозов ребенка, но только если ребенок хорошо себя ведет.

List<childerns>allChilderns=parentsList.stream().map(parent>dao.findchildernByParentId()).collect(Collectors.List());

allChilderns.stream().filter(childern->childern.isWellBehaved()==true).collect(Collectors.toList());
  1. Получить всех родителей по GrandParentId - тот, который вы делаете.
  2. Как только вы получили всех родителей, для каждого родителя найдитеchydernByParentId.
  3. и затем отфильтровываем детей по условию.

Дайте мне знать:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...