2016-04-27 91 views
1

代碼:java.lang.ClassCastException:[Ljava.lang.Object;不能被強制轉換爲類名

public void getDetails() { 
try { 
Session session = sessionFactory.openSession(); 
Transaction transaction = session.beginTransaction(); 
String hql = "select c.mobile, c.password FROM CrbtSubMasterDemo c where rownum<20"; 
Query query = session.createQuery(hql); 
List<CrbtSubMasterDemo> itr = query.list(); 
session.getTransaction().commit(); 
for (CrbtSubMasterDemo pojo : itr) {//excepion line 
System.out.println("[" + pojo.getMobile() + "]"); 
} 
} catch (Exception e) { 
e.printStackTrace(); 
} 
} 

CrbtSubMasterDemo是POJO與數據庫映射。 當我嘗試運行它,它提供了以下異常:

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.telemune.demoPojo.CrbtSubMasterDemo 
at com.telemune.demoHibernate.QueryTester.getDetails(QueryTester.java:57) 
at com.telemune.demoHibernate.QueryTester.main(QueryTester.java:23) 

的問題是query.list()將返回POJO類的對象的列表。那麼爲什麼是這個例外。我是Hibernate的新手,對不起,如果它是一個愚蠢的問題。

+0

@ v.ladynev請幫助先生。 –

回答

1

爵士,很多時候用戶面對這個有點要求。 Hibernate有ResultTransformer來轉換Object中的hql/sql。

public CrbtSubMasterDemo{ 
     private Stirng mobile; 
     private String password; 

      public CrbtSubMasterDemo(){ 
      -------------- 
     } 

     #####after setting the transation set whichever columns you are selecting should be given as name of property of your object 
     String hql = "select c.mobile as mobile, c.password as password FROM CrbtSubMasterDemo c where rownum<20"; 
     Query query = session.createQuery(hql); 
     List<CrbtSubMasterDemo> itr = query.setResultTransformer(Transformers.aliasToBean(CrbtSubMasterDemo.class)).list(); 
     ##No need to commit the transaction. 
    } 

它會轉換您查詢到CrbtSubMasterDemo

+0

這是一個真正的解決方案。你能給我我可以探索我的Criteria/Hibernate概念嗎? –

+0

@ sunixi請解釋我們爲什麼不在這裏提交交易 –

+0

您可以在需要限制的地方使用Criteria。 Like Criteria cr = session.createCriteria(CrbtSubMasterDemo.class); cr.add(Restrictions.lt(「rownum」,20)); List list = cr.list(); – sunixi

3

當你這樣寫:

String hql = "select c.mobile, c.password FROM CrbtSubMasterDemo c where rownum<20"; 

結果集是不是ListCrbtSubMasterDemo

一個嘗試寫:

String hql = "select FROM CrbtSubMasterDemo c where rownum<20"; 

另一種方法是定義CrbtSubMasterDemo其中一個新的構造你只通過兩個字段c.mobile, c.password

所以你的查詢就會變成:

String hql = "select new " + CrbtSubMasterDemo.class.getName() + "(c.mobile, c.password) FROM CrbtSubMasterDemo c where rownum<20"; 

如果按照這個方案,remeber添加一個默認的構造太(不帶參數),所以在你的POJO您有:

public CrbtSubMasterDemo(String mobile, String password) { 
    this.mobile = mobile; 
    this.password = password 
} 

public CrbtSubMasterDemo() { 
} 
+0

@ JoeTaras可能是我使用它錯了,但它變成:錯誤:無法找到類[com.telemune.demoPojo.CrbtSubMasterDemo]上適當的構造函數。預期的參數是:java.lang.String,java.lang.String 無法在類上找到適當的構造函數預期的參數是:java.lang.String,java.lang.String。字符串 –

+2

@yashpalbharadwaj您需要爲'CrbtSubMasterDemo'添加一個帶有兩個'String'參數的構造函數。你也需要一個默認的構造函數。 –

+0

@yashpalbharadwaj:我已經更新了我的答案,添加了一個完整的類路徑。如果兩個字段中的一個爲空,則另一個可以是reaso。是的,正如已經寫v.ladynew,你也必須添加一個默認的構造函數(沒有參數) –

2
String hql = "select c.mobile, c.password FROM CrbtSubMasterDemo c where rownum<20"; 
Query query = session.createQuery(hql); 

結果將會是List<Object[]>

List<Object[]> itr = query.list(); 

for (Object[] row : itr) { 
    System.out.println(String.format("mobile:%s, password:%s", row[0], row[1])); 
} 

if mobilepassword當然是字符串。您可以使用變壓器將結果直接轉換爲CrbtSubMasterDemo

Hibernate 3.2: Transformers for HQL and SQL

FluentHibernateResultTransformer

+0

是的,它的工作......但你能告訴我......它留下的POJO的作用是什麼......我沒有使用任何類的吸氣器,甚至沒有使用pojo的對象。我將如何獲得它在我的POJO上工作的想法?感謝幫助。 –

+0

@yashpalbharadwaj不清楚你所問的問題。對於來自CrbtSubMasterDemo的查詢,您將有一個List 。對於'select mobile,password FROM CrbtSubMasterDemo'的查詢,你將會有一個'List '。 –

1

不要直接投的結果 「query.list();」到CrbtSubMasterDemo列表。作爲query.list()返回對象列表。遍歷對象列表接收並投下一個個擺在CrbtSubMasterDemo

的列表列表
相關問題