Подтвердить что ты не робот

Hibernate Выдавать выписку, даже если FetchMode = Join

У меня есть объект userAccount, сопоставленный с сущностью страны. Отображение страны в классе UserAccount выглядит следующим образом

@ManyToOne(fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@JoinColumn(name="f_country_id", nullable=true, insertable=false, updatable=false)
private Country country;

Даже если fetchmode определяется как Join, hibernate запускает отдельный SQL Select для выбора стран.

4b9b3361

Ответ 1

Удалите fetch=FetchType.EAGER. Нежелательная выборка запускает каскадные команды выбора.

Ответ 2

Сатадру Бисвас дал ответ в предыдущем комментарии.

Hibernate 3.x игнорирует аннотацию FetchMode при использовании интерфейса Query (Session.createQuery), поэтому в этом случае вам нужно добавить предложение INNER JOIN FETCH в часть FROM вашего запроса.

Интерфейс критериев, однако, будет правильно использовать этот интерфейс.

Ответ 3

Я пытаюсь использовать hibernate @Fetch (FetchMode.JOIN) adnotation во всех api (JPQL и CriteriaBuilder), но не работает. Только этот код в классе службы работает нормально:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserAccount > cq = cb.createQuery(UserAccount.class);
Root<UserAccount> o = cq.from(UserAccount.class);

o.fetch("country",JoinType.INNER);

em.createQuery(cq.select(o)).getResultList();

Ответ 4

Я использую запрос критериев для извлечения Клиентов.

public class PurchaseOrder
{
    .....
    .....      
    @ManyToOne(fetch=FetchType.EAGER, optional=true)
    @JoinColumn(name="ReportingCustomer_ID", nullable=true, insertable=false, updatable=false)
    @Fetch(FetchMode.JOIN)
    @NotFound(action=NotFoundAction.IGNORE)
    public ReportingCustomer getReportingCustomer()
    {
        return reportingCustomer;
    }
}

При получении PurchaseOrder он делает LEFT OUTER JOIN как ниже

select ... from PurchaseOrder this_ left outer join ReportingCustomer reportingc2_ 
on this_.ReportingCustomer_ID=reportingc2_.ReportingCustomer_ID
where ...
  • Когда есть запись в ReportingCustomer - она ​​запускает только указанный выше запрос.
  • Если в ReportingCustomer нет записи для этой записи - она ​​запускает запрос для каждого запроса PURCHASEORDER (m + 1).

Я использую драйвер "Прогресс" для подключения к БД. Я не уверен, почему он запускает m + 1 запросов только в сценарии 2.