Рассмотрим сущность, содержащую пару коллекций другой сущности.Один из вложенных объектов имеет свойство timestamp, другой имеет родительский объект с timestamp.Для иллюстрации (лишние поля и методы опущены):
Foo
@Entity
public class Foo {
@OneToMany
private Set<Bar> bars;
@OneToMany
private Set<BazDetail> bazzes;
}
Bar
@Entity
public class Bar {
@ManyToOne
private Foo foo;
private Date timestamp;
}
BazDetail
@Entity
public class BazDetail {
@ManyToOne
private BazMaster master;
}
BazMaster
@Entity
public class BazMaster {
private Date timestamp;
}
У меня также есть интерфейс FooRepository
, который расширяет JpaRepository
public interface FooRepository extends JpaRepository<Foo, Integer> {}
Использование принятого ответа в Как отфильтровать дочернюю сущность при запросе родителя в спящем режиме в качестве модели я пытаюсь получить Foo
s с отфильтрованными коллекциями:
@Query("SELECT f " +
"FROM Foo f " +
"LEFT JOIN f.bars barSet " +
"LEFT JOIN f.bazzes bazDetailSet " +
"LEFT JOIN bazDetailSet.master master " +
"WHERE barSet.timestamp < :cutoff " +
"AND master.timestamp < :cutoff ")
List<Foo> findAllFilteredByDate(@Param("cutoff") Date d);
Ожидаемый (ожидаемый?) вывод - это отдельный экземпляр каждого Foo
в таблице, содержащий только Bar
и BazDetail
экземпляров с отметкой времени до даты отсечения (если существует) или пустой коллекции (если нет).
Фактический вывод - это один или несколько экземпляров только Foo
s с соответствующими записями Bar
и BazDetail
, в которых размер вложенной коллекции может или не может варьироваться в зависимости от экземпляра (например, Foo с идентификатором1 находится в наборе результатов дважды, каждый экземпляр имеет коллекции с разными размерами, но Foo с идентификатором 2 находится в наборе результатов 4 раза, но коллекции в каждом экземпляре имеют одинаковый размер).
Итак, наконец, мой вопрос: как я могу иметь метод запроса JpaRepository, который возвращает экземпляр каждого Foo в базе данных с его вложенной коллекцией, отфильтрованной по метке времени?