2011-04-18 57 views
1

我已經離開去調試一些我沒寫的hibernate代碼。我直言不諱地承認,我正努力讓自己的頭腦在Hibernate如何將查詢集中到這一點上,所以請耐心等待。如何調整Hibernate查詢

我們看到的問題是,Web應用程序花費了大量的時間來加載頁面(使用JSP,Spring和Hibernate)。

其中一個正在執行的查詢引用了一個映射中的公式,該映射似乎在執行hibernate的查詢中使用了兩次。第一個引用是列值,第二個引用用作內部聯接的標準。第二個,在內部聯接中,強制執行一個我們不需要的全表掃描,更不用說它讓查詢真的很慢。

有沒有辦法調整hibernate查詢,以便它不在查詢中使用此公式(列值除外)?請告知您是否需要更多信息。

編輯:每按照要求,這裏是我從登錄Hibernate獲取查詢:

SELECT this_.PARTY_ID  AS PARTY1_23_2_, 
    this_.STUDENT_ID   AS STUDENT3_23_2_, 
    this_.STUDENT_PIDM  AS STUDENT4_23_2_, 
    this_.USERNAME   AS USERNAME23_2_, 
    this_.FIRST_NAME   AS FIRST6_23_2_, 
    this_.LAST_NAME   AS LAST7_23_2_, 
    this_.ACTIVE    AS ACTIVE23_2_, 
    subjectenr1_.PARTY_ID  AS PARTY1_24_0_, 
    subjectenr1_.OFFERING_ID AS OFFERING2_24_0_, 
    subjectenr1_.RSTS_CODE AS RSTS3_24_0_, 
    subjectenr1_.SITE_CODE AS SITE4_24_0_, 
    subjectenr1_.PROGRAM_CODE AS PROGRAM5_24_0_, 
    (SELECT su2.offering_id 
    FROM sakaicfg.subject_offering su2 
    WHERE su2.offering_id = subjectenr1_.OFFERING_ID 
)        AS formula0_0_, 
    subjectoff2_.OFFERING_ID  AS OFFERING1_25_1_, 
    subjectoff2_.CRN    AS CRN25_1_, 
    subjectoff2_.IS_ACTIVE   AS IS3_25_1_, 
    subjectoff2_.TEACHING_SCHOOL AS TEACHING4_25_1_, 
    subjectoff2_.CAMPUS    AS CAMPUS25_1_, 
    subjectoff2_.START_SEMESTER  AS START6_25_1_, 
    subjectoff2_.STUDYMODE   AS STUDYMODE25_1_, 
    subjectoff2_.SUBJECT_ID   AS SUBJECT8_25_1_, 
    subjectoff2_.GRADE_MARKING_CODE AS GRADE9_25_1_, 
    (SELECT MAX(su2.effective_semester) 
    FROM sakaicfg.subject su2 
    WHERE su2.subject_id  = subjectoff2_.SUBJECT_ID 
    AND su2.effective_semester <= subjectoff2_.START_SEMESTER 
) AS formula1_1_ 
FROM SAKAICFG.STUDENT this_ 
INNER JOIN SAKAICFG.SUBJECT_ENROLMENT subjectenr1_ 
ON this_.PARTY_ID=subjectenr1_.PARTY_ID 
INNER JOIN SAKAICFG.SUBJECT_OFFERING subjectoff2_ 
ON (SELECT su2.offering_id 
    FROM sakaicfg.subject_offering su2 
    WHERE su2.offering_id  = subjectenr1_.OFFERING_ID)=subjectoff2_.OFFERING_ID 
WHERE this_.ACTIVE   ='Y' 
AND subjectenr1_.RSTS_CODE <>'DD' 
AND subjectoff2_.IS_ACTIVE ='Y' 
AND subjectoff2_.OFFERING_ID='35505' 
ORDER BY this_.PARTY_ID DESC; 

有問題的部分是摘錄:爲

(SELECT su2.offering_id 
    FROM sakaicfg.subject_offering su2 
    WHERE su2.offering_id = subjectenr1_.OFFERING_ID 
) 

映射xml文件Subject登記表包含以下關係:

<many-to-one name="student" entity-name="CsuActiveStudentDto" column="PARTY_ID" insert="false" update="false" access="field" unique="false"/> 
<many-to-one name="subjectOffering" entity-name="CsuSubjectOfferingDto" insert="false" update="false" access="field" unique="false"> 
    <formula>(select su2.offering_id 
      from sakaicfg.subject_offering su2 where su2.offering_id = OFFERING_ID)</formula> 
</many-to-one> 
<one-to-one name="student" class="au.edu.csu.enterprise.domain.StudentDto" property-ref="enrolment"/> 
<many-to-one name="offering" class="au.edu.csu.enterprise.domain.SubjectOfferingDto" column="OFFERING_ID"/> 

我一直在與我們的一位DBA一起研究查詢並隔離那些需要查看的查詢,這就是我們如何找到這一問題的方法。

+0

如果你把一個例子,甚至真正的查詢可能有幫助,如果它是不要太長。 – 2011-04-18 05:39:00

+0

Hib查詢可以像SQL一樣進行優化。因此你擁有的任務當然是可行的。但是你需要顯示代碼。 – 2011-04-18 05:42:01

回答

0

您可以通過自定義SQL(而不是hql)爲每個實體(以及集合)重寫Hibernate Create Read Update和Delete語句。

有關詳細信息看看Hibernate參考:Chapter 17.3. Custom SQL for create, update and delete以及它是如何工作在休眠批註參考:Chapter 2.4.10. Custom SQL for CRUD operations

@Entity 
@SQLInsert(sql="INSERT INTO Demo(name, id) VALUES(?,?)") 
@Loader(namedQuery = "betterLoad") 
@NamedNativeQuery(name="betterLoad", 
     query="select id, name from Demo where id= ?", 
     resultClass = Demo.class) 
public class Demo { 
    @Id 
    private Long id; 
    private String name; 
}