Используйте EntityGraph для запроса с необязательным отношением ManyToOne.JAVA

Программисты JAVA общаются здесь
Anonymous
Используйте EntityGraph для запроса с необязательным отношением ManyToOne.

Сообщение Anonymous »

У меня есть объект Hibernate с необязательной связью с другим объектом:

Код: Выделить всё

@NamedEntityGraph(
name = "expense-for-frontend",
attributeNodes = {
@NamedAttributeNode("shipment"),
})
@Entity
public class Expense {
...
@ManyToOne(fetch = FetchType.LAZY, optional = true)
private Shipment shipment;
...
}
Я хочу иметь возможность загружать расходы независимо от того, есть ли у них поставки, но если у них есть поставки, они должны вернуться заранее -loaded, чтобы избежать поездок туда и обратно по БД. В репозитории есть запрос типа:

Код: Выделить всё

  @EntityGraph("expense-for-frontend")
@Query(
"""
SELECT e
FROM Expense e
LEFT JOIN Shipment s ON e.shipment.id = s.id
WHERE (:status IS NULL OR e.status = :status)
""")
List
 findAllFilteredShipmentExpensesWithPayment(
@Param("status") @Nullable VendorPaymentStatus status);
При этом выполняется следующий SQL:

Код: Выделить всё

select eb1_0.id, ...
from expense eb1_0
join shipment s1_0 on s1_0.id=eb1_0.shipment_id
left join shipment sb1_0 on sb1_0.tenant_id = ? and eb1_0.shipment_id=sb1_0.id
...
Внутреннее соединение с отправкой добавляется @NamedAttributeNode("shipment") в EntityGraph, а s1_0 не является используется в остальной части запроса. Поскольку он добавляет внутреннее соединение, я не могу получить какие-либо расходы, которые не связаны с поставками, при использовании этого EntityGraph.
Я не могу найти способ изменить EntityGraph, чтобы разрешить необязательную связь ManyToOne.
  • Я не хочу удалять @NamedAttributeNode("shipment") из EntityGraph, потому что это приводит к дополнительному обращению базы данных туда и обратно для каждой строки расходов, а их много.
  • Я не могу найти способ настроить NamedAttributeNode, чтобы указать ему создавать левое соединение.
Похоже, это очень распространенная ситуация, и возможность обнуления столбца раскрывается через стандартную аннотацию персистентности Джакарты @ManyToOne( fetch = FetchType.LAZY, необязательный = true), поэтому я предполагаю, что EntityGraph правильно справится с этой ситуацией. Я что-то упустил?

Подробнее здесь: https://stackoverflow.com/questions/790 ... lationship

Вернуться в «JAVA»