2012-05-31 10 views
7

私はクラスのツリーを持っている:リスト<Object[]>の代わりにオブジェクトタイプをHibernateに戻す方法はありますか?

classA { 
     classB b; 
     classC c; ..... 
} 

のように私はHQLクエリを持っている:このクエリは、リストを返す

select a.field1, b.field2, c.field3, c.field4 from a left 
outer join b on a.id=b.fk  left outer join c on b.id=c.fk 

。ハイバーネイトを使用してキャストすることは可能ですか?

classD { 
    Type1 fiedl1; 
    Type2 field2; 
    Type3 field3; 
} 

キャスティングは、休止状態で行うか、手動ですべてのキャスティングを行う必要がありますか?おかげさまで

+0

'aを左外側から結合bを選択a.id = b.fk左外側結合cをb.id = c.fk'で探していますか? – nullpotent

+1

番号クエリはリストを返しますが、そのクエリがリストを返すようにします。リスト user810430

+0

http://stackoverflow.com/questions/18361558/java-math-biginteger-cannot-be-cast-to-java-lang-long – gavenkoa

答えて

22

を使用することができますJPAクエリーでの選択のさまざまな種類があります。 現在、Arrayを戻り値の型として使用しています。必要なものは、戻り値の型を作成することです。ここではこれを実現する方法である:

String queryStr = 
    "select NEW package.YourDefinedCustomClass(
    a.field1, b.field2, c.field3, c.field4) from a left outer join b 
    on a.id=b.fk left outer join c on b.id=c.fk"; 

TypedQuery<YourDefinedCustomClass> query = 
    em.createQuery(queryStr, YourDefinedCustomClass.class); 

List<YourDefinedCustomClass> results = query.getResultList(); 

基本的に2つのものがあります:

  1. カスタムクラスは、あなたの結果は、タイプ
  2. カスタムクラスは、結果の値を取るコンストラクタを持っている必要があります返さなければなりませんあなたはクエリ文字列で定義します。

Read more on selects in JPA2 queries.

+0

正確な答えをありがとう!答えをさらに正確にするために、コンストラクタ名は完全修飾でなければならず、あなたのパッケージ名の予約語は問題につながることを指摘したいと思います。(http://stackoverflow.com/questions/30891824) 。 – naXa

+0

私は共有セッション契約を使用していますので、私は 'entityManager'オブジェクトを持っていません。とにかくこれを回避するには? – MarceloBarbosa

1

あなたが本当にあなたがタイプキャストを行うことができると確信しているなら。

List<classD> newlist = ...; 
for(Object o : list){ 
     newlist.add((classD) o); 
} 

はいだから、このかかわら

に注意してください。手動キャスティング。 (注:アレイと(あなたが直接)にキャストすることができます)

+0

Isntリストはリストのタイプです?私はそれを、あなたの答えを得ることはありません。 – JMelnik

2

あなたはTypedQuery

TypedQuery<ClassA> q = em.createQuery("select a from a left outer join b on a.id=b.fk left outer join c on b.id=c.fk", ClassA.class); 
List<ClassA> res = q.getResultList(); 
+1

この種類の戻り値の型は、単一の値の選択に対してのみ機能します。 JPAドキュメントには、「クエリの選択リストには1つの項目だけが含まれていなければなりません。これはresultClass引数で指定された型に割り当てる必要があります。そして、Hibernateのソースは、「要求された結果の型["+ resultClass.getName()+"] "'を使用して複数の戻り値を持つクエリに対してTypedQueryを作成できないと言っています。したがって、基本的にはIllegalArgumentExceptionがスローされます - クエリ文字列が無効であるか、クエリ結果が指定された型に割り当てられない場合、 – JMelnik

+0

私のHQLは正常です。あなたはすべてについて正しいです。 – nullpotent

0

私は同じproblem..iこのクエリ

Query sqlquery = session.createQuery("select c.courseName,f.facultyID,f.facultyName,f.facultyEmailID,f.facultyContactNo,s.subjectName from com.bean.CourseBean as c,com.bean.FacultyBean as f,com.bean.Faculty_SubjectBean as fs,com.bean.SubjectBean as s where f.facultyID=fs.facultyBean.facultyID AND s.subjectID=fs.subjectBean.subjectID AND c.courseID=f.courseBean.courseID AND collegeid=1"); 

を書いていたし、私は、オブジェクトのリストを返し、サーブレットで私は、

java.util.ListのOBJLISTを書きました= objFacultyService.listFaculty_sql(1);

java.util.List<Temp> objtemp = new ArrayList<Temp>() ; 
for (Object[] objects : objList) 
{ 


     Temp temp = new Temp(); 
     temp.setFacultyEmailID(objects[3].toString()); 
     temp.setCourseName(objects[0].toString()); 
     if(objects[4]==null) 
     { 
      temp.setFacultyContactNo(1); 
     } 
     else 
     { 
        temp.setFacultyContactNo(Long.parseLong(objects[4].toString())); 
     } 
     temp.setFacultyID(Long.parseLong(objects[1].toString())); 
     temp.setFacultyName(objects[2].toString()); 
     temp.setSubjectName(objects[5].toString()); 
     objtemp.add(temp); 




} 
関連する問題