2012-06-26 37 views
1

我正在使用Hibernate 3.0。以下是爲獲取數據而編寫的標準。休眠:SetMaxResults不能使用java.util.Map

1. Criteria criteria = session.createCriteria(Document.class); 
2. criteria.setMaxResults(10); 
3. criteria.setFetchMode("metadata",FetchMode.join); 
4. criteria.setFetchMode("activitySchedules", FetchMode.JOIN); 
5. criteria.setFetchMode("activitySchedules.activities",FetchMode.JOIN); 
6. criteria.setResultTransformer(criteria.DISTINCT_ROOT_PROPERTY); 
7. criteria.list(); 

在此標準,setMaxResults(10)不工作。它只給出1個結果來定義10個限制。如果我評論第四行,結果會以正確的方式進行。我沒有得到這種奇怪的行爲。這是提取MAP的問題嗎?如果有人知道這個讓我知道。

BeanStrucutre:

Document.java

private NormMaster metadata; 

private Map<TransactionFlowEnum, ActivitySchedule> activitySchedules; 

public NormMaster getMetadata(){ 
     return metadata; 
} 

public void setMetadata(NormMaster metadata){ 
    this.metadata = metadata; 
} 

public Map<TransactionFlowEnum, ActivitySchedule> getActivitySchedules() { 
     return activitySchedules; 
    } 

public void setActivitySchedules(
     Map<TransactionFlowEnum, ActivitySchedule> activitySchedules) { 
     this.activitySchedules = activitySchedules; 
    } 

ActivitySchedule.java

private List<Stage> activities; 

public List<Stage> getActivities() { 
    return activities; 
} 

public void setActivities(List<Stage> activities) { 
    this.activities = activities; 
} 

NormMaster.java

private String name; 

public void setName(String name){ 
this.name = name; 
} 

public return getName(){ 
return name; 
} 

編輯:如果我把一個多個領域Document.java和獲取元數據除外然後activitySchedules正確的數據來了。

+0

只是猜測,'setMaxResults'正在處理標準,並且您也應用了'DISTINCT_ROOT_PROPERTY'。它實際上是產生10行,但作爲獨特只有一行得到返回相同的重複時,'setMaxResults(20)'這次發現20行,但只有兩個不同。當你評論連接操作時,它獲取10個不同的行並返回它們,我認爲'FetchMode.JOIN'正在應用'inner join'嘗試在這裏執行一個左連接,希望你能得到預期的結果。 – manurajhada

+1

@ manurajhada,setMaxResults和Distrinct_Root_Property之間沒有關係。 Distinct_Root通常在應用FETCH_MODE連接時應用。如果一次有多個連接,hibernate會爲此返回多個對象,並且當您應用Distinct_root時,它只會一次提供1個連接。請注意,但這不是我的問題的解決方案。 – PVR

+0

正如JB所說,它適用於不在對象上的sql行數返回,這意味着您的連接正在返回數量的sql行,但每個條件只返回一個對象。 – manurajhada

回答

6

setMaxResults()限制來自執行的SQL查詢的JDBC結果集返回的行數。它不限制從條件查詢返回的對象的數量。

對於沒有任何聯合抓取的簡單請求,這兩個數字是相同的。但對於在toMany關聯上具有聯合提取的查詢,數字不是。例如,如果一個文檔有2個時間表,並且這些時間表中的每一個都有3個活動,那麼您的查詢將爲這個文檔返回6個JDBC行。所以,如果你打電話給setMaxResults(4),你會在查詢中得到一個不完整的文檔。

setMaxResults()不應該與這樣的查詢一起使用。解決方法包括執行僅返回文檔ID的查詢,並在此查詢上應用setMaxResults()。一旦擁有了10個ID,就可以使用提取連接執行第二個查詢,並返回具有這10個ID之一的文檔(where document.id in (:documentIds))。