【问题标题】:How does Hibernate SQL generation works ? (used with Criteria API, setfirstResults and setMaxresult)Hibernate SQL 生成是如何工作的? (与 Criteria API、setfirstResults 和 setMaxresult 一起使用)
【发布时间】:2011-08-17 15:36:57
【问题描述】:

我有一个关于 Hibernate 在与 Criteria API 一起使用时如何生成 SQL 的问题。我有一个名为 Mission 的 @Entity。每个任务都链接到一个客户(已为其创建任务)和一个资源(分配给此任务的人)。当我像这样查询所有任务的列表时:

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 似乎为每个任务生成 ma​​xResults 查询。

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=?

所以我有 ma​​xResults 次 这个查询。我认为它只会触发 ONE TIME 类似的东西

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

有人可以向我解释为什么它会生成所有这些查询吗?我怀疑它会对整体性能产生影响。

非常感谢,

【问题讨论】:

    标签: sql hibernate criteria-api


    【解决方案1】:

    什么是底层数据库? Hibernate 尽其所能,但如果数据库没有实现limit,它就必须自己做一些跑腿工作(例如 SQL Server)。

    【讨论】:

    • 该应用程序由 MySQL 数据库支持,我确信它存在 LIMIT x OFFSET y 语法。
    • Guyz,其实我认为问题可能是由于我的 RequestFactory。我正在使用它从数据库中获取任务列表,并且由于任务实体与我的实体客户端具有多对一的关系,我必须使用“with(client)”调用我的 RequestFactory 查询,以便客户端在任务中引用对象也被初始化......所以我猜,这就是它为客户端生成所有这些日志的原因。
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 2021-05-29
    • 2013-11-12
    • 2017-04-13
    • 2018-04-28
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多