将Hibernate Resultset转换为包含pojos列表的pojo

时间:2016-05-18 23:35:13

标签: java spring hibernate resulttransformer

我有一个类似的pojo:

StudentResultPojo{
studentId;
studentName;
studentEmail;
List<CourseResultPojo> coursePojoList;
}

CourseResultPojo看起来像这样:

CourseResultPojo{
name;
teacher;
time;
teacherPhone;
teacherEmail;
}

我有学生,课程,教师,电话,电子邮件等的Hibernate实体(数据库:Postgres)。

以下是我的代码片段:

String query = "SELECT
    distinct student.id as \"studentId\",
    student.name as \"studentName\",
    student.email as \"studentEmail\"
FROM
    sample.sample_Student student";

Query q = entityManager.unwrap(Session.class).
                createSQLQuery(query).
setResultTransformer(Transformers.aliasToBean(StudentResultPojo.class));
        return q.list(); 

我想在NativeSQL中保留查询而不是JPQL。 编辑:因为查询可以随时更改。我想将查询存储在数据库中并根据需要进行编辑。如果它在Native查询中将更容易进行测试。

我知道JPQL有一个类似的功能,我们可以将结果从JPA查询转换为pojo,通过它的构造函数如select new(Pojo.class.getName()....)但是它有同样的问题我正面临着。

凭借我所拥有的,我将不得不遍历我的服务返回的StudentResultPojo列表,并且我必须通过浏览他们的Hibernate关系从数据库或Java代码中检索数据来为每个StudentResultPojo填充coursePojoList。这需要一些时间。

实体看起来像:

Student{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
private String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "student")
private Set<Course> courses = new HashSet<>(0);

}

Course{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", unique = true, nullable = false)
private Long id;
private String name;
private String time;
@ManyToOne(fetch = FetchType.LAZY)   
@JoinColumn(name = "student_id", referencedColumnName = "pk")    
@ForeignKey(name = "student_course")     
private Student student;
@OneToOne(fetch = FetchType.LAZY, mappedBy = "course")
private Set<Teacher> teacher;
}
......

问题:如果我有一个返回2行结果的查询(不是JSON,只是运行查询时返回的结果)

1, James, james.t@yahoo.com, Physics, Albert, 9.00, 7887897899, physics.teacher@yahoo.com
1, James, james.t@yahoo.com, English, Jackie, 10.00, 7887097899, english.teacher@yahoo.com

有没有办法可以使用CourseResultPojos列表将结果转换为单个StudentResultPojo?

意味着我的StudentResultPojo将属性值设为

1, James, james.t@yahoo.com for id, name and email respectively

,该列表将包含两个带

的CourseResultPojo对象
1st Object values as Physics, Albert, 9.00, 7887897899, physics.teacher@yahoo.com for attributes name, teacher,    time,teacherPhone,teacherEmail

2nd Object values as English, Jackie, 10.00, 7887097899, english.teacher@yahoo.com for attributes name,teacher,time,teacherPhone,teacherEmail

谢谢。

1 个答案:

答案 0 :(得分:0)

我想我会尽力帮助您提供帮助:StudentResultPojoCourseResultPojo

你可以做些什么来实现JSON Stris为2个对象创建一个包装类(即StudentCoursePojo):

Public class StudentCoursePojo {
   private StudentResultPojo student;
   private List<CourseResultPojo> courses;
   // ...getters and setters
} 

如果您希望List StudentCoursePojo作为JSON字符串,请猜猜是什么?您还可以为它创建一个包装器:

    Public class StudentCourseList {
        private List<StudentCoursePojo > studentCourses;
         // ...getters and setters
    } 

然后,您可以使用JacksonGSONStudentCoursePojoStudentCourseList序列化为JSON。

一些有用的教程:

How to use the managed client for Azure Mobile Apps

http://www.mkyong.com/java/jackson-2-convert-java-object-to-from-json/

希望这会有所帮助。

修改

由于您的StudentResultPojo已包含CourseResultPojo,因此您只需构建此对象,然后为List StudentResultPojo创建一个包装器。然后使用上述选项序列化为JSON。