Как работает генерация Hibernate SQL?(используется с Criteria API, setfirstResults и setMaxresult) - PullRequest
0 голосов
/ 17 августа 2011

У меня есть вопрос о том, как Hibernate генерирует SQL при использовании с Criteria API.У меня есть @Entity под названием Mission.Каждая миссия связана с Клиентом (для которого была создана миссия) и ресурсом (которым назначено лицо для этой миссии).Когда я запрашиваю список всех миссий, таких как:

entityManager.getTransaction().begin();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Mission> criteriaQuery = criteriaBuilder.createQuery(Mission.class);
Root<Mission> mission = criteriaQuery.from(Mission.class);
...
criteriaQuery.select(mission);
TypedQuery<Mission> query = entityManager.createQuery(criteriaQuery);
missions = query.setFirstResult(firstResult).setMaxResults(maxResults).getResultList();
entityManager.getTransaction().commit();

Похоже, что Hibernate генерирует maxResults запросов для каждой миссии.

Hibernate: 
    select
        missionsc0_.ID_CLIENT as ID10_7_1_,
        missionsc0_.ID_MISSION as ID1_1_,
        missionsc0_.ID_MISSION as ID1_11_0_,
        missionsc0_.active as active11_0_,
        missionsc0_.ID_CLIENT as ID10_11_0_,
        missionsc0_.CODE_ARTICLE as CODE3_11_0_,
        missionsc0_.HAS_PERIODE as HAS4_11_0_,
        missionsc0_.DESCRIPTION as DESCRIPT5_11_0_,
        missionsc0_.END_DATE as END6_11_0_,
        missionsc0_.LIBELLE as LIBELLE11_0_,
        missionsc0_.ID_RESSOURCE as ID11_11_0_,
        missionsc0_.START_DATE as START8_11_0_,
        missionsc0_.VERSION as VERSION11_0_ 
    from
        MISSION missionsc0_ 
    where
        missionsc0_.ID_CLIENT=?

Так что яиметь maxResults умножить на этот запрос.Я думал, что это вызовет ONE TIME с чем-то вроде

SELECT * FROM Mission WHERE ... LIMIT 0, MaxResults

Может кто-нибудь объяснить мне, почему он генерирует все эти запросы?Я подозреваю, что это повлияет на общие характеристики.

Большое спасибо,

1 Ответ

0 голосов
/ 17 августа 2011

Что является базовой базой данных?Hibernate делает то, что может, но если база данных не реализует limit, ей придется выполнять работу самостоятельно (например, SQL Server).

...