HQL для фильтрации вложенных коллекций сущностей по метке времени - PullRequest
0 голосов
/ 24 апреля 2019

Рассмотрим сущность, содержащую пару коллекций другой сущности.Один из вложенных объектов имеет свойство 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 в базе данных с его вложенной коллекцией, отфильтрованной по метке времени?

...