2012-01-26 78 views
5
final Criteria crit = session.createCriteria(MyClass.class); 
final List<MyClass> myClassList = crit.list(); 

結果在此: 類型安全:List類型的表達式需要選中轉換爲符合列出避免類型安全警告與Hibernate條件查詢

是他們刪除警告的方法,如我得到使用這樣的錯誤:

final List<MyClass> myClassList = Collections.checkedList(MyClass.class, crit.list()); 

回答

6

好了,你可以使用:

@SuppressWarnings("unchecked") 

聲明之前...

請注意,這隻會抑制警告 - 它不會做任何事情來使代碼更安全。在這種情況下,我個人對此很滿意。我相信Hibernate做正確的事情。

+0

@EvertonAgner:我正在通過「刪除警告」位的問題。 –

+0

是啊,我知道......我的意思是我們應該知道他是否想要解決這個問題,或者他是否只是有強迫症有關警告........因爲我做*大聲笑 – everton

+2

如果你依靠一個返回無類型集合的第三方API,除了禁止警告外,沒有太多有用的工作可做。並添加評論,解釋爲什麼你可以保證該集合的元素真的是正確的類型。 –

4

在你的代碼

final List<MyClass> myClassList 
    = Collections.checkedList(MyClass.class, crit.list()); 

你只需要的參數的順序逆checkedList()

順便說一下,你可以靜態導入的方法,使你的代碼更加簡潔。 也順便說一句,我不知道關於checkedList() - 謝謝你的提醒!

編輯checkedList()沒有做你想做的事 - 因爲我應該意識到,如果我在回答之前正確地考慮過它。

checkedList()將檢查添加到列表中的任何元素的類型,並立即失敗。與正常列表相反,這將允許您輸入錯誤的類型,並且僅在檢索時纔會失敗。在你的情況下,它沒有什麼區別,因爲你不會自己插入項目(我猜)。

Jon Skeet的回答(@SuppressWarnings("unchecked"))是正確的。

+0

我仍然收到警告......在反轉參數後 – NimChimpsky

+0

對不起 - 沒有仔細看。用更好的信息編輯我的回覆。 –

1

對我來說,爲避免類型安全警告的最佳方式是Matt Quail說,在這個帖子:How to avoid type safety warnings with Hibernate HQL results?,寫鑄助手,但與標準,而不是查詢,像這樣:

@SuppressWarnings("unchecked") 
public static <T> List<T> listAndCast(Criteria crit) { 
    List<T> list = crit.list(); 
    return list; 
} 

而且只你必須調用這個方法:

List<MyClass> myClassList = listAndCast(crit); 

問候!