2010-09-11 134 views
3

那麼問題標題說,我試圖做一個投影標準只查詢表的幾個屬性。休眠標準投影

所以我有一個Person Table /類,它有大約40個屬性。我希望我的標準來獲得屬性的動態數量,可以說,10,11或12(SQL方面select firstname, lastname from person),我在做這樣的:

Transaction tx = session.beginTransaction(); 
Criteria crit = session.createCriteria(Person.class); 
crit.setCacheable(true); 
ProjectionList projList = Projections.projectionList(); 
projList.add(Projections.property("id")); 
Criterias c = null; 
for (int i = 0; i < checked.size(); i++) { 
     Attribute attr = checked.elementAt(i); 
     switch (attr) { 
      case LASTNAME: 
       projList.add(Projections.property("lastName")); 
       c = enumMap.get(attr); 
       if (c.isChanged()) { 
        String tmp = (String) c.getAnswer(); 
        tmp = tmp.replace('*', '%'); 
        crit.add(Restrictions.like("lastName", tmp)); 
        crit.addOrder(Order.asc("lastName")); 
       } 
      case ...THE REST ..... 
      } 
    crit.setProjection(projList); 
    retList = crit.list(); 
    tx.commit(); 
    return retList; 

而且還給了retList元素不是從Person.class

INFO [AWT-EventQueue的-0](UserGroupManagerApp.java127) - [Ljava.lang.Object; @ 14b9b80
致命[AWT-EventQueue的-0](Login.java78) - java.lang中.ClassCastException:[Ljava.lang.Object;無法轉換爲usergroupmanager.model.db.Person java.lang.ClassCastException:[Ljava.lang.Object;不能投到usergroupmanager.model.db.Person

請幫忙,現在我列出所有40+ attr,它佔用了查詢時間,我不喜歡它。我正在尋找替代解決方案,這將幫助我解決這個問題。我讀了約ResultTransformer,但沒有找到如何使用它在我的情況。

+0

什麼是retList的定義 – Mark 2010-09-11 13:29:30

+0

List retList = null;在開始時,我測試了它與泛型現在列表 retList = null和相同的東西 – Darwly 2010-09-11 13:33:44

回答

4

[Ljava.lang.Object;不能轉換爲 usergroupmanager.model.db.Person

說,在Object[]不能轉換到Person乾淨的話。當你做一個投影時,你會得到你選擇的屬性作爲一個對象數組,而不是水合實體。

您的代碼缺少retlist的聲明。我想這是一個原始的List,你在某個地方投了一個List<Person>。只需用List<Object[]>替換即可。

+0

謝謝你,我最終想出來,但它在那個時候令人沮喪..謝謝一堆 – Darwly 2010-09-11 23:50:13

0

如果您在Hibernate中使用投影,則不會查詢Hibernate創建對象所需的所有數據。因此Hibernate不能創建這些對象。

因此,來自投影的查詢只返回查詢返回的SQL數組,即它返回一個s List,並且您可以在該數組中以普通條目的形式訪問這些字段。

5

您可以使用criteria.setResultTransformer()

有在Hibernate中提供了一些變形金剛。如果你的人沒有任何關聯使用:

criteria.setResultTransformer(Transformers.aliasToBean(Person.class)); 

但是,如果人有任何關聯,在http://github.com/moesio/seimos

,如果你用它來代替標準大量的代碼可以被挽救考慮使用Seimos。

+0

它適用於我。謝謝! – sura2k 2013-03-13 09:39:32