Итак, я застрял в этой проблеме около половины дня, поэтому мне интересно, не слишком ли я усложняю вещи.
Мое приложение имеет три различных класса объектов 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);
}