2012-05-16 26 views
0

我想利用數據庫獨立的HQL和類型安全的Criteria API。但我沒有實體類。如何使用沒有實體類的Hibernate Criteria API?

我可以直接使用Criteria API嗎?

+1

自己回答的問題:如何在不知道實體和實體屬性類型的情況下實現類型安全? – Thomas

+0

按類型安全我的意思是在編譯時驗證查詢。字符串查詢不能在編譯時檢查。 –

+0

我們知道,但是如何驗證查詢而不知道您是否獲得了正確的實體以及實體是否具有您在查詢中訪問的字段? – Thomas

回答

3

不,你不能。 HQL和Criteria API的要點是根據實體和它們之間的關聯來查詢對象模型。

+0

我不會同意這一說法。 ORM只是HQL和Criteria API的特性之一。 Criteria API與ORM沒有多大關係。 –

+0

@SumeetJindal:所以,當你在做'criteria.createAlias(「category.products」,「category」);',如果你沒有一個帶有toMany關聯的Category實體,你期望它如何工作一個產品實體? –

+0

我不關心關聯。我想要像操作 –

2

首先很容易注意到Criteria API通常被用來替代HQL來構建動態查詢(「HQL非常強大,但是一些開發人員更喜歡使用面向對象的API動態構建查詢,而不是構建查詢字符串reference link)。

其次,Hibernate是一個對象/關係(數據庫)持久性實現。爲了使用 ,我們需要定義其對象應映射到目標數據庫表(實體)中的類。

對於標準API是用於使用域類的Hibernate會話獲得:

Criteria crit = sess.createCriteria(Cat.class); 
crit.setMaxResults(50); 
List cats = crit.list(); 

會話對象使用從「貓」類到它的相應的表(可能在名爲「貓」的映射數據庫)。

因此,最終沒有實體類和它們的映射,沒有會話對象。沒有Session,沒有Criteria對象。

準則需要知道需要查詢的類(Cat.class)。

+0

這可以幫助嗎? http://docs.redhat.com/docs/en-US/JBoss_Enterprise_Web_Platform/5/html/Hibernate_Core_Reference_Guide/persistent-classes-dynamicmodels.html –

+0

在給定的鏈接中解釋的技術解釋聽起來很棒,第一次。但它有許多缺點。首先你的代碼不是「類型安全的」,你不能在編譯時檢查Map的值(它們的類型)是否真的對應你希望映射的實體表。其次,作爲後果,您可能會遇到許多通用運行時異常。最後他們說該功能目前是實驗性的,並且可能會在未來發生變化。目前它不穩定,我會試一試 – arthur

+0

@Sumeet Jindal,一個主要的問題是,正如已經解釋的那樣,「Criteria」API需要Object的.class類來查詢。在動態地圖爲「實體模式」的情況下,Criteria不知道選擇哪個類/實體,因爲只有可用的類型是「MAP」。 – arthur

0

你怎麼能說hibernate你想應用哪個類critera?

所以你必須在createcriteria(Entity.class)中傳遞實體類的名字。

而你...標準提供了豐富的功能,這將減少你的代碼。

但是請注意......所有的事情都有積極的消極的一面。

標準也有一些負面的...

所以..要小心。根據您的應用相關規範使用

相關問題