2011-09-21 30 views
3

所以我仍然試圖讓自己熟悉Hibernate Criteria API,並且我有一段我想要澄清的Java代碼。關於Hibernate API中Criteria.createCriteria的問題

Criteria c = super.getSession().createCriteria(PpNnCtDetail.class); 
c.add(Restrictions.between("commencementDate", fromDate, toDate); 

這部分我明白髮生了什麼 - 把它在SQL方面,它會是這樣的 - 糾正我,如果我錯了,

SELECT * FROM PpNnCtDetail WHERE commencementDate >= fromDate AND commencementDate <= toDate; 

問題帶有以下兩個代碼上面的線。

c = c.createCriteria("nnContractTbl"); 
c.createCriteria("progCategory").add(Restrictions.in("progCategoryId", allProgCat)); 
c.createCriteria("acadOrgTbl"); 
c.createCriteria("serviceType"); 
c.createCriteria("campusTbl"); 
return c.list(); 

什麼是第一條線要完成的?這個任務是否回到了冗餘?

事實上,c.createCriteria試圖實現哪些行?什麼是等效的SQL查詢?更重要的是,c.list()會返回什麼?

回答

2

c = c.createCriteria("nnContractTbl");上的指定是多餘的,createCriteria和幾乎所有的Criteria方法修改它們被調用的實例,並返回實例本身以用於方法指定。所以,你可以鏈的調用是這樣的:

return super.getSession().createCriteria(PpNnCtDetail.class) 
    .add(Restrictions.between("commencementDate", fromDate, toDate) 
    .createCriteria("nnContractTbl") 
    .createCriteria("progCategory").add(Restrictions.in("progCategoryId", allProgCat)) 
    .createCriteria("acadOrgTbl") 
    .createCriteria("serviceType") 
    .createCriteria("campusTbl") 
    .list(); 

而關於該序列的結果,Criteria.createCriteria(association)將導致內已經在標準加入數據之間,並在協會設計表由屬性建模association。它也會在聯合實體中「根」(如他們在Javadocs中所述)標準,以便在進一步調用createCriteria(association)時,association引用在最後一個「根」實體上聲明的關聯屬性。

這是Criteria.createCriteria(association, joinType)的簡寫,joinTypeCriteriaSpecification.INNER_JOIN

1

上面指定的那些createCriteria基本上等同於傳入實體的INNER JOIN。

尋找問題答案(同時也學習hibernate)的最佳方法是在你的hibernate配置文件中找到turn SQL logging on,並檢查生成的SQL。