Java Jooq-连接表并映射到另一个pojo
我有以下课程:Java Jooq-连接表并映射到另一个pojo,java,jooq,Java,Jooq,我有以下课程: class Student { String student_id; String name; List<GradeValue> grades; } class Grades { String id; String student_id; Long grade_value; } class GradeValue { Long grade_value; } 我试图使用JOOQ来进行一个查询,返回所有学生的
class Student {
String student_id;
String name;
List<GradeValue> grades;
}
class Grades {
String id;
String student_id;
Long grade_value;
}
class GradeValue {
Long grade_value;
}
我试图使用JOOQ来进行一个查询,返回所有学生的所有成绩值
为了实现这一点,我必须加入学生表和成绩表,但我应该将成绩转换为成绩值,我不知道如何做到这一点
List<Student> students = dsl.select(jsonObject(
jsonEntry("id", STUDENT.STUDENT_ID),
jsonEntry("name", STUDENT.NAME),
jsonEntry("grades", field(
select(jsonbObjectAgg(GRADES.GRADE_VALUE))
.from(GRADES)
.where(GRADES.STUDENT_ID.eq(STUDENT.STUDENT_ID))
))
)).from(STUDENT)
.fetchInto(Student.class);
给我这个错误:
原因:
com.fasterxml.jackson.databind.exc.MismatchedInputException:无法
从中反序列化java.util.ArrayList的实例
在[Source:String{id:1,name:test,
等级:{grade_值:10}};行:1,列:99]
有什么想法吗
谢谢您的代码片段存在许多问题: 使用JSONArrayAg而不是JSONBObObjectAgg 我想,你不想把分数聚合成一个对象,而是一个数组?使用,而不是。有关详细信息,请参见以下手册章节: 此外,我建议决定使用JSON或JSONB方法,而不是混合使用它们。但是您编写查询的方式,对于 班级学生{ 字符串学生id; 字符串名; 列出职系; } 由于要在另一个类中包装成绩,因此必须在生成的JSON结构中反映这一点: List students=dsl.selectjsonObject keystudent_id.valueSTUDENT.STUDENT_id, keyname.valueSTUDENT.NAME, keygrades.valuefield //请看这里的补丁 选择JSONARRAYAGJSONObject keygrade\u值。valueGRADES.GRADE\u值 .fromGRADES .whereGRADES.STUDENT\u ID.eqSTUDENT.STUDENT\u ID fromSTUDENT先生 .fetchIntoStudent.class; 进入学生课堂 也许只是一个打字错误,但你写道: .fetchIntoSTUDENT.class 你可能想写: .fetchIntoStudent.class 投影正确的属性名称 您的学生类具有Student_id属性,但您正在投影id: jsonEntryid,STUDENT.STUDENT\u ID 最好也将该属性重命名为id或project student\u id 聚合空集
请注意,JSON_ArrayAg将空集聚合为NULL,而不是空[] 这并不能解决问题。@fitameh795:我不知道您可能遇到了什么新问题,但您使用jsonbObjectAgg没有多大意义。正如您在日志中看到的,当您想要获得JSON数组[10]时,您得到了一个JSON对象{grade_value:10}。我很乐意为您介绍任何可能的进一步问题,但我需要更多的信息,而不是这不起作用…@fitameh795:好的,我发现了。请参阅更新的答案。