有没有一种方法可以自动将jOOQ记录Map到Java记录?

63lcw9qa  于 2023-01-11  发布在  Java
关注(0)|答案(1)|浏览(136)

对于本例,我使用的是Sakila Sample Database
假设我有一条Film记录,如下所示:

public record Film(UShort filmId, String title) {
}

如果我正在阅读jOOQ中的影片,我可以使用以下命令轻松地将它们Map到Film

List<Film> films = this.context.select(Tables.FILM.FILM_ID, Tables.FILM.TITLE)
                               .from(Tables.FILM)
                               .limit(10)
                               .fetch(Records.mapping(Film::new));

现在假设我需要每部电影以及与之相关的演员,为此,我决定使用multiset

Set<SelectField<?>> readFields = Set.of(
    Tables.FILM.FILM_ID,
    Tables.FILM.TITLE,
    DSL.multiset(
        DSL.select(Tables.FILM_ACTOR.actor().FIRST_NAME, Tables.FILM_ACTOR.actor().LAST_NAME)
           .from(Tables.FILM_ACTOR)
           .where(Tables.FILM_ACTOR.FILM_ID.eq(Tables.FILM.FILM_ID))
        )
       .as("actors")
);

var result = this.context.select(readFields)
                         .from(Tables.FILM)
                         .limit(10)
                         .fetch();

现在我有了结果,我想将它们Map到记录FilmActors中:

public record FilmActors(UShort filmId, String title, List<Actor> actors) {
    public record Actor(String firstName, String lastName) {
    }
}

有没有办法自动完成,或者在ModelMapper这样的库的帮助下完成?如果可能的话,我希望避免滚动定制的RecordMapper。谢谢!
我尝试使用jOOQ的内置Records类,并尝试查看ModelMapper是否支持记录。

bqf10yzr

bqf10yzr1#

我想在 *Using ad hoc converter on nested collection * 下找到了一个答案hereconvertFrom做到了这一点:

Field<List<FilmActors.Actor>> actors = DSL.multiset(
                                              DSL.select(Tables.FILM_ACTOR.actor().FIRST_NAME, Tables.FILM_ACTOR.actor().LAST_NAME)
                                                 .from(Tables.FILM_ACTOR)
                                                 .where(Tables.FILM_ACTOR.FILM_ID.eq(Tables.FILM.FILM_ID))
                                          )
                                          .as("actors")
                                          .convertFrom(record -> record.map(Records.mapping(FilmActors.Actor::new)));

List<FilmActors> filmActors = this.context.select(Tables.FILM.FILM_ID, Tables.FILM.TITLE, actors)
                                          .from(Tables.FILM)
                                          .limit(10)
                                          .fetch(Records.mapping(FilmActors::new));

相关问题