クラスのツリーがあります:
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で行うことができますか、それとも手動ですべてキャストする必要がありますか?
JPAクエリには、さまざまなタイプの選択があります。 現在、戻り値の型として配列を使用しています。必要なのは、戻り値の型の構築です。これを実現する方法は次のとおりです。
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つがあります:
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();
Hibernate 5.xを使用している場合は、ResultTransformer
を使用できます。たとえば、 このブログ投稿で のように記述できます。 ResultTransformer
はHibernate 6で@非推奨になることに注意してください。
シナリオに適用:
_List<classD> classDDTOs = entityManager
.createQuery(
"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")
.unwrap( org.hibernate.query.Query.class )
.setResultTransformer(
new ResultTransformer() {
@Override
public Object transformTuple(
Object[] Tuple,
String[] aliases) {
return new classD(
(Type1) Tuple[0],
(Type2) Tuple[1],
(Type3) Tuple[1],
);
}
@Override
public List transformList(List collection) {
return collection;
}
}
)
.getResultList();
_
上記のコードは、classD
にコンストラクターclassD(Type1, Type2, Type3)
があることを前提としています。
このアプローチの利点は、ResultTransformer
を一度定義して、同じ結果タイプのすべてのクエリで再利用できることです。
あなたが本当にタイプキャストをすることができると確信しているなら。
List<classD> newlist = ...;
for(Object o : list){
newlist.add((classD) o);
}
これに注意してください
あ、はい。手動キャスト。 (注:配列あり(直接キャストできます))
私は同じ問題を抱えていました。このクエリを書きました
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);
}