2013-02-04 33 views
1

嗨,夥計們我試圖開發一個單一的Java類,它的作用類似於org.hibernate.Criteria的包裝以優雅的方式擺脫一堆添加(限制)。這是我到目前爲止的遺留系統。org.hibernate.Criteria一堆添加(限制)擴展org.hibernate.internal.CriteriaImpl

public static void prepareForSelect(Criteria crit) { 
    crit.add(Restrictions.eq("cid","1")); 
    crit.add(Restrictions.eq("did","2"); 
    crit.add(Restrictions.eq("fdl","3")); //omit for brevity 
} 

是非常inadecuate我知道,我試圖實現延伸org.hibernate.internal.CriteriaImpl一個Java類,並有我需要限制的特性,我想。這個類有這樣的方法。

public org.hibernate.Criteria addStandartsRestrictions(){ 
    return this.add(Restrictions.eq("cid",getCid())).add(Restrictions.eq("did",getDid())).add(Restrictions.eq("fdl",getFdl())); 
} 

,並在我的Java代碼調用它是這樣的:

org.hibernate.Criteria myOwnCriteria = ((FullCriteria)Session.getSession().createCriteria(MyJava.class)).addStandartsRestrictions();  

,但我發現以下異常

Exception in thread "main" java.lang.ClassCastException: org.hibernate.internal.CriteriaImpl cannot be cast to org.com.utilities.classes.FullCriteria 
at javaapplication8.JavaApplication8.main(JavaApplication8.java:12) 

也許是不可能辦到的事我不知道,請人指導我通過。

我錯誤的實現。

public class FullCriteria extends org.hibernate.internal.CriteriaImpl 
{} 

回答

1

Session.createCriteria()永遠不會返回您自己的條件實施的實例。正如你所看到的那樣,將結果投射到你的班級將無濟於事,因爲施法決不會改變對象的類型。

假設你有一個動物的參考。而你知道這個動物一匹馬。然後您可以這樣做:

Horse horse = (Horse) animal; 

爲了能夠調用Horse中存在的方法而不存在於Animal中。如果這個動物實際上是一頭牛,那麼你會得到一個ClassCastException,因爲一頭牛不是一匹馬。

您正在使用繼承,你應該使用組合。你的課不應該擴展CriteriaImpl。它應該使用委託給,一個標準實例。

+0

我也實施了Criteria我的班級得到同樣的錯誤,你可以提供給我一個鏈接來閱讀關於它的一些東西。非常感謝 – javiut

+0

這並沒有改變任何東西。當你調用'session.createCriteria()',你要求Hibernate爲你創建一個標準。 Hibernate不知道你的類。它創建它自己的CriteriaImpl類的一個實例,並返回它。我們試着做一個比喻。你在車庫裏設計一種新的自行車。然後你去自行車店買自行車。商店賣給你的自行車不會和你在車庫裏設計的自行車一樣。事實上,這兩件事都是自行車並沒有改變任何東西。 –

+0

是的,你是對的,這意味着不可能完成我在找什麼? – javiut

0

請勿鍵入cast Criteria對象到您自己的實現類的實例,它將引發錯誤java.lang.ClassCastException: org.hibernate.internal.CriteriaImpl cannot be cast to com.uk.mysqlmaven.domain.CommonLookUpMaster

您可以通過下面的例子

例出現上述錯誤:

Session session = SessionFactoryMySqlMaven.getCurrentSession(); 
Criteria criteria = session.createCriteria(CommonLookUpMaster.class); 
CommonLookUpMaster master = (CommonLookUpMaster) criteria.add(Restrictions.eq("type", type)); 

使用criteriauniqueResult()方法,我們可以得到基於限制單個記錄。 如果你想獲得single記錄,然後用下面的例子

例1:

Session session = SessionFactoryMySqlMaven.getCurrentSession(); 
Criteria criteria = session.createCriteria(CommonLookUpMaster.class); 
criteria = criteria.add(Restrictions.eq("type", type)); 
CommonLookUpMaster master = (CommonLookUpMaster) criteria.uniqueResult(); 

爲了得到例如

下面 multiple records as a list使用

例2:

Session session = SessionFactoryMySqlMaven.getCurrentSession(); 
Criteria criteria = session.createCriteria(CommonLookUpMaster.class); 
criteria = criteria.add(Restrictions.eq("type", type)); 
List<?> list = criteria.list();