如何在Hibernate中返回特定类型的列表而不是List ?

我有课程树:

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

是否可以将返回的数据强制转换为以下类:

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

那么可以通过Hibernate进行转换,还是我需要手动完成所有的转换?

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 query = em.createQuery(queryStr, YourDefinedCustomClass.class); List results = query.getResultList(); 

基本上有两件事:

  1. 自定义类必须是结果返回类型
  2. 自定义类必须具有构造函数,该构造函数接受在查询字符串中定义的结果值。

阅读有关JPA2查询中的选择的更多信息。

您可以使用TypedQuery

 TypedQuery 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 res = q.getResultList(); 

如果你确定你可以做类型转换。

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

我返回了对象列表,在我写的servlet中,

java.util.List objList = objFacultyService.listFaculty_sql(1);

 java.util.List objtemp = new ArrayList() ; 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); } 

如果您使用Hibernate 5.x,则可以使用ResultTransformer ,例如, 在此博客文章中描述。 请注意,在Hibernate 6中, ResultTransformer将被@Deprecated。

适用于您的场景:

 List 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一次,并允许您在具有相同结果类型的所有查询中重用它。