2011-08-17 24 views
0

我有一個關於Hibernate如何在與Criteria API一起使用時生成SQL的問題。我有一個名爲Mission的@Entity。每個任務都與一個客戶(任務已經創建)和一個資源(這是分配給這個任務的人)相關聯。當我查詢所有類似的任務列表:Hibernate SQL生成如何工作? (與Criteria API,setfirstResults和setMaxresult一起使用)

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 

有人能向我解釋爲什麼它的產生所有這些疑問?我懷疑它會對整體表演產生影響。

非常感謝,

回答

0

什麼是底層數據庫? Hibernate盡其所能,但是如果數據庫沒有實現limit,它必須自己完成這項工作(例如SQL Server)。

+0

該應用程序由一個MySQL數據庫支持,我確信它存在LIMIT x OFFSET y語法。 – kaffein

+0

Guyz, 其實我認爲這個問題可能是由於我的RequestFactory。我使用它從數據庫中獲取Mission列表,並且因爲Mission Entity與我的實體Client有多對一的關係,我必須使用「with(client)」調用我的RequestFactory查詢,以便客戶端在任務中引用對象也被初始化了......所以我猜,這就是爲什麼它會爲客戶端生成所有這些日誌。 – kaffein