Используйте 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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