0

我有一个类似的pojo:

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

CourseResultPojo 看起来像这样:

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

我有学生、课程、教师、电话、电子邮件等的休眠实体(数据库: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 中。编辑:因为查询可以随时更改。我想将查询存储在数据库中并根据需要进行编辑。如果在本机查询中,测试会更容易。

我知道 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

谢谢你。

4

1 回答 1

0

我想我会尽力帮助您解决问题:aStudentResultPojoCourseResultPojo

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

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

如果你想要 a ListofStudentCoursePojo作为 JSON 字符串,你猜怎么着?您还可以为其创建一个包装器:

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

然后,您可以使用Jacksonor将您的orGSON序列化为 JSON。StudentCoursePojoStudentCourseList

一些有用的教程:

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

http://www.mkyong.com/java/how-do-convert-java-object-to-from-json-format-gson-api/

希望这可以帮助。

编辑:

由于您StudentResultPojo已经包含CourseResultPojo,您可以简单地构建此对象,然后为 a 创建一个包装器ListStudentResultPojo然后使用上述选项序列化为 JSON。

于 2016-05-19T02:38:21.613 回答