2017-01-13 19 views
0

我有一個Hibernate查詢來檢索限於最大數量的行的列表。但是,當我讀了Hibernate的日誌,我驚訝的是,它在內部過濾器只具有一行select count(*)爲什麼Hibernate會記錄一個不實際執行的不同查詢?

-- Log4j 
-- INFO [STDOUT] Hibernate: 
select * 
from (select count(*) as y0_ 
     from yyy this_ 
     where this_.type=3 and 
        this_.VALUE=2 and 
        this_.src='ZZZZZ' 
    ) 
where rownum <= 100; 

的outter標準的子查詢是這樣的:

criteria.setProjection(Projections.rowCount()); 
criteria.setMaxResults(MAX_RESULTS); // MAX_RESULTS = 100 

final List results = criteria.list(); // It executes the above query here. 

什麼解釋這個行爲?我對日誌中的這個誤導性結果有更多疑問。

回答

2

您正在設置計數預測。這使得休眠返回計數:

select count(*) from ... 

然後你告訴Hibernate中,雖然沒有辦法讓不是單行更多這樣的查詢,以限制返回的行最大100行的列表。正確的方法做到這一點使用你的數據庫是做休眠做什麼:

select * from (<original query>) where rownum <= 100; 

如果你不想讓沒用包裹查詢,後來乾脆不叫無用setMaxResults(100)方法。

+0

我的意思是,setMaxResulst實際上會將檢索到的數據過濾100。這是必要的。我做了一個內部查詢,它有1500個返回值,所以我需要100個過濾器,不要超載。它按預期進行過濾。但另一方面,Hibernate以不同的方式解釋查詢,就像它只有1個計數(*)一樣。我將用內部查詢更新問題。感謝您的及時答覆。 – another

+0

執行select count(*),沒有任何group by的查詢不能返回多於1行。永遠不會返回1500行。 –

+0

我會擴展代碼,我可能會略過一些代碼。 – another

相關問題