SimpleFlatMapper:多个 1-N 关系

SimpleFlatMapper: Multiple 1-N relationship

提问人:localhost 提问时间:11/15/2023 更新时间:11/15/2023 访问量:16

问:

请参考此链接:

https://www.petrikainulainen.net/programming/jooq/jooq-tips-implementing-a-read-only-one-to-many-relationship/#comment-1966747

导入 java.util.List;

public class StudentDTO {
 
    private Long id;
    private String name;
    private List<BookDTO> books;
 
    //Getters and setters are omitted
}

这里有一本 1-N 关系书需要提取。 这是通过 addKeys 实现的。

但是,让我们说 POJO 是否是:

public class StudentDTO {
 
    private Long id;
    private String name;
    private List<BookDTO> books;
    private List<CourseDTO> courses;
    //Getters and setters are omitted
}

那么我们怎样才能实现呢?

java jpa jooq jdbctemplate

评论

0赞 localhost 11/15/2023
解决方案之一是拥有客户映射器。我也不确定如何实现它。不确定。
0赞 localhost 11/15/2023
另外,我不想做多个查询。

答:

1赞 Lukas Eder 11/15/2023 #1

我知道您选择使用 SimpleFlatMapper 是因为那篇文章推荐了它。但是 jOOQ 有一种更好的开箱即用的方法来映射多关系,请参阅 MULTISET 运算符

假设你有一个属性的构造函数,甚至使用一个类型:record

public record StudentDTO(
    Long id,
    String name,
    List<BookDTO> books,
    List<CourseDTO> courses
{}

您现在可以编写如下查询:

List<StudentDTO> students =
ctx.select(
       STUDENT.ID,
       STUDENT.NAME,
       multiset(
           select(STUDENT_BOOK.book().ID, ...)
           .from(STUDENT_BOOK)
           .where(STUDENT_BOOK.STUDENT_ID.eq(STUDENT.ID))
       ).convertFrom(r -> r.map(Records.mapping(BookDTO::new))),
       multiset(
           select(STUDENT_COURSE.course().ID, ...)
           .from(STUDENT_COURSE)
           .where(STUDENT_COURSE.STUDENT_ID.eq(STUDENT.ID))
       ).convertFrom(r -> r.map(Records.mapping(CourseDTO::new)))
   )
   .from(STUDENT)
   .fetch(Records.mapping(StudentDTO::new));

临时转换功能使整个事物类型安全。

评论

0赞 localhost 11/16/2023
您好,感谢您的评论。是的,这应该已经解决了问题。但是由于某种原因,我无法使用JOOQ。我只能使用 SimpleFlatMapper。
0赞 Lukas Eder 11/16/2023
@localhost:祝你好运。我不知道如何使用第三方库 SimpleFlatMapper 做这些事情。我真的建议回顾一下“某种原因”并升级到上述方法。但也许其他人可以回答你关于“SimpleFlatMapper”的原始问题