Hibernate Выдает оператор select, даже если FetchMode = Join - PullRequest
28 голосов
/ 28 марта 2011

У меня есть объект 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 для выборки стран.

Ответы [ 4 ]

17 голосов
/ 28 марта 2011

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

10 голосов
/ 01 июня 2013

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

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

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

5 голосов
/ 03 сентября 2014

Я пытаюсь использовать аннотацию спящего режима @Fetch (FetchMode.JOIN) во всех 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();
0 голосов
/ 17 августа 2015

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

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 он выполняет ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ, как показано ниже

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...