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:好的,我发现了。请参阅更新的答案。