14

私はクラスのツリーを持っています:

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 

このクエリは を返しますList<Object[]>

返されたデータを次のクラスにキャストすることは可能ですか:

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

キャストは Hibernate で行うことができますか、それともすべてのキャストを手動で行う必要がありますか?

4

5 に答える 5

30

JPA クエリにはさまざまな種類の選択があります。現在、戻り値の型として Array を使用しています。必要なのは Construct の戻り値の型です。これを達成する方法は次のとおりです。

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. カスタム クラスには、クエリ文字列で定義した結果値を取るコンストラクタが必要です。

JPA2 クエリでの選択の詳細を参照してください。

于 2012-05-31T07:44:07.513 に答える
2

型キャストを行うことができると本当に確信している場合。

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

これでも気をつけてね

あ、はい。手動キャスト。(注:配列を使用(直接キャストできます))

于 2012-05-31T07:35:26.230 に答える
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(); 
于 2012-05-31T07:39:53.453 に答える
0

私は同じ問題を抱えていました..私はこのクエリを書きました

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);




}
于 2013-12-27T10:58:56.073 に答える