Ответ 1
Удалите fetch=FetchType.EAGER
. Нежелательная выборка запускает каскадные команды выбора.
У меня есть объект 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 для выбора стран.
Удалите fetch=FetchType.EAGER
. Нежелательная выборка запускает каскадные команды выбора.
Сатадру Бисвас дал ответ в предыдущем комментарии.
Hibernate 3.x игнорирует аннотацию FetchMode при использовании интерфейса Query (Session.createQuery), поэтому в этом случае вам нужно добавить предложение INNER JOIN FETCH в часть FROM вашего запроса.
Интерфейс критериев, однако, будет правильно использовать этот интерфейс.
Я пытаюсь использовать 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();
Я использую запрос критериев для извлечения Клиентов.
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 ...
Я использую драйвер "Прогресс" для подключения к БД. Я не уверен, почему он запускает m + 1 запросов только в сценарии 2.