Я пытаюсь реализовать это в моем проекте:
Specification<Delivery> shipmentSpec = ((root, query, builder) ->
builder.or(builder.equal(root.join("entries").get("shipment").get("senderGeography"), geo),
builder.equal(root.join("entries").get("shipment").get("receiverGeography"), geo)));
Specification<Delivery> collectSpec = ((root, query, builder) ->
builder.equal(root.join("entries").get("collect").get("geography"), geo));
repository.findAll(Specification.where(shipmentSpec).or(collectSpec);
И это ничего не возвращает.но это работает хорошо, если я использую только одну спецификацию, такую как: repository.findAll(Specification.where(shipmentSpec));
или
repository.findAll(Specification.where(collectSpec));
У объекта доставки есть поле:
@OneToMany(mappedBy = "delivery")
private List<Entry> entries = new ArrayList<>();
И сущность Entry имеет поля:
@ManyToOne
@JoinColumn(name = "SHIPMENT_ID")
private Shipment shipment;
@ManyToOne
@JoinColumn(name = "COLLECT_ID")
private Collect collect;
Одно из этих полей всегда пустое, но не оба одновременно.
Объекты Отгрузка и Сбор имеют поля:
@ManyToOne(optional = false)
@JoinColumn(name = "GEOGRAPHY_ID", nullable = false)
private Geography geography;
(Отгрузка имеет 2 региона)
Мне нужна опция, чтобы вернуть все объекты Доставки, которые есть в записях отгрузки ИЛИсобрать с указанной географией.
Спасибо.
ОБНОВЛЕНО.
Я попытался получить объекты с @Query, но он действует так же, как метод спецификации, возвращает пустой список:
@Query("select d from Delivery d, Entry e where e.delivery.id = d.id " +
"and (e.shipment.senderGeography = ?1 or e.shipment.receiverGeography = ?1 or e.collect.geography = ?1)")
List<Delivery> findByGeography(Geography geo);
Это работает, только если я оставил в запросе предложение (e.shipment.senderGeography = ?1 or e.shipment.receiverGeography = ?1)
или e.collect.geography = ?1
.Но не оба.