2012-02-28 40 views
3

我試圖得到一個表中的列的最小值。這聽起來微不足道,但我遇到問題(我正在使用MySql 5.1數據庫)。休眠Projections.min()返回了多行

的情況有點複雜。 我們有一個從兩個類實現的接口。 這兩個類別的每一個都從另外三個類別擴展而來。 每兩根這三個extendors的具有休眠映射(基類還具有映射)=>所以我們有 接口I由

實施

CLASSA(映射)由classA1(映射),classA2(映射)擴展, classA3通過classB1(映射), classB2(映射),classB3(未映射)

下面是一個例子代碼問題伸展(未映射)CLASSB(映射):

Criteria c = getSession().createCriteria(samplesType) 
    .setProjection(Projections.min("pollingTime")); 
List resultList= c.list()`enter code here`; 

.LIST()執行後有三個值中resultList: 首先爲空,其次爲null,第三個包含我正在尋找正確的最小值。

我用c.uniqueResult()但 「收益」

org.hibernate.NonUniqueResultException:查詢未返回唯一結果 :3

我也試着使用Hibernate的

createQuery(select min(pollingTime) from tableName).list() 

但結果是一樣的(兩個空值和一個正確的結果)。

我也嘗試添加預定使用ResultTransformer以從列表中刪除空值,但我失敗了。

作爲一種變通方法,我可以使用SQL查詢得到所需要的最低值:

createSQLQuery("SELECT MIN(pool_time) FROM tableName") 

這是當下唯一的解決辦法。

你有什麼想法,爲什麼返回的結果是不正確的?

問候, 尼基

回答

1

我發現這個空值返回的原因。正如我所描述的那樣,系統中有一些繼承。 因此,在搜索基類表中的最小值時,hibernate會嘗試查找所有子類表的最小值。 在我們的例子中,子類的表是空的,所以沒有最小值,因此它和子類表中的空值一起找到了正確的值。

作爲解決我在休眠映射文件多態性設置爲明確的問題:

<class name="class" table="TABLE" polymorphism="explicit"> 

上述禁止搜索在指定的表,而搜索的超類表。

Niki

2

,而不是着眼於從列表中移除null S,我想你應該找出他們的來源。我想知道,你有表格行,其中該列的值是NULL?也許你應該嘗試這樣的:

select min(r.pollingTime) from r : tableName where r.pollingTime != NULL 
+0

事實上,這是我直接用MySQL查詢瀏覽器檢查的第一件事情之一。此欄中沒有任何空值。 考慮到該列不是唯一鍵並且沒有設置爲無效,這是一個很好的觀點。 Niki 編輯:我也同意最好找出爲什麼我得到空值而不是找到一種方法來從結果中篩選它們。 – user1228603 2012-02-28 11:38:29

+0

我也試過下面的代碼。 String qryStr =「select min(tn.pollingTime)from」+ tableName +「tn where tn.pollingTime!= NULL」; List resultList = getSession()。createQuery(qryStr).list(); 列表中的結果現在顛倒過來: minValue,null,null。 它看起來,只要我使用休眠(查詢,creteria,投影等)爲這個任務它返回錯誤的結果。 – user1228603 2012-02-28 13:31:38

1

根據你的數據類型,整數和字符串的最小值可能會不同。例如,如果將整數11視爲最大值,則爲1,2,11。但如果作爲一個字符串2是最大的。

驗證什麼是列的數據類型。

+0

所有映射文件中的數據類型都很長。它包含以毫秒爲單位存儲在類和db中的時間(按照在hibernate映射中定義的時間)。 – user1228603 2012-02-28 13:16:32