Java 函数json对象,使用JOOQ在查询生成器中创建json数组

Java 函数json对象,使用JOOQ在查询生成器中创建json数组,java,postgresql,jooq,Java,Postgresql,Jooq,我不久前开始使用jooq。我喜欢它,但在构建查询时遇到了一个问题 我的工具是Postgresql、Java11和Springboot。我想从数据库中获取一些数据,而不需要额外的行 我有两个表,它们之间有多对多关系。 轻松使用sql: 然后我得到了这个: 身份证件 名称 信息 身份证件 作者 [{“title”:“title_1”,“desc”:“desc_1”},{“title”:“title_2”,“desc”:“desc_2”},…] 如果使用json聚合的目的是将查询结果映射到嵌入的对象列

我不久前开始使用jooq。我喜欢它,但在构建查询时遇到了一个问题

我的工具是Postgresql、Java11和Springboot。我想从数据库中获取一些数据,而不需要额外的行

我有两个表,它们之间有多对多关系。 轻松使用sql:

然后我得到了这个:

身份证件 名称 信息 身份证件 作者 [{“title”:“title_1”,“desc”:“desc_1”},{“title”:“title_2”,“desc”:“desc_2”},…]
如果使用json聚合的目的是将查询结果映射到嵌入的对象列表,例如

public class SomeDto {
    // ...other fields
    private List<InnerDto> innerDtoList;
}
dto:

公共类AuthorDto{
@钥匙
私有整数编写器;
@钥匙
私有字符串名称;
私人名单信息;
}
公开课资讯{
私有字符串标题;
私有字符串描述;
}
jooq查询:

public List<AuthorDto> fetchAuthors(Integer myAuthorId) {

    final Select<?> query = defaultDSLContext
        .select(
            authorBookTable.AUTHOR_ID,
            authorTable.NAME,
            bookTable.TITLE.as("infos.title"), 
            bookTable.DESC.as("infos.desc")
        )
        .from(authorBookTable)
        .join(bookTable).on(bookTable.ID.eq(authorBookTable.BOOK_ID))
        .join(authorTable).on(authorTable.ID.eq(authorBookTable.AUTHOR_ID))
        .where(authorBookTable.AUTHOR_ID.eq(myAuthorId));

        try (final ResultSet resultSet = query.fetchResultSet()) {
            
            return JdbcMapperFactory
                .newInstance()
                .newMapper(AuthorDto.class)
                .stream(resultSet)
                .collect(toList());

         } catch (final SQLException e) {
             // ...
         }

}
公共列表获取作者(整数myAuthorId){
最终选择查询=defaultDSLContext
.选择(
authorBookTable.AUTHOR\u ID,
authorTable.NAME,
bookTable.TITLE.as(“信息标题”),
bookTable.DESC.as(“infos.DESC”)
)
.from(authorBookTable)
.join(bookTable).on(bookTable.ID.eq(authorBookTable.BOOK\u ID))
.join(authorTable).on(authorTable.ID.eq(authorBookTable.AUTHOR\u ID))
.where(authorBookTable.AUTHOR_ID.eq(myAuthorId));
try(final ResultSet ResultSet=query.fetchResultSet()){
返回JdbcMapperFactory
.newInstance()
.newMapper(AuthorDto.class)
.stream(结果集)
.collect(toList());
}捕获(最终SQLE异常){
// ...
}
}
或者,您可以在基类或utils类的某个地方编写泛型方法,而不是在任何地方都这样做。像这样:

protected <T> List<T> groupingFetch(final Select<?> query, final Class<? extends T> type) {

    try (final ResultSet resultSet = query.fetchResultSet()) {

        return JdbcMapperFactory
            .newInstance()
            .newMapper(type)
            .stream(resultSet)
            .collect(toList());
    
    } catch (final SQLException e) {
        // ...
    }
}

protectedlist groupingFetch(final Select query,final Class您似乎没有正确配置jOOQ在您的
defaultDSLContext
实例中使用
sqldialent.POSTGRES
,否则它不会生成标准SQL/JSON语法,如:

json_arrayagg(json_object(key ? value ...))

谢谢!!我已经在config
jooqConfiguration.set(sqldialent.POSTGRES);
中添加了函数
arrayAgg()
但没有指定方言,所以我没有考虑这种方法
public List<AuthorDto> fetchAuthors(Integer myAuthorId) {

    final Select<?> query = defaultDSLContext
        .select(
            authorBookTable.AUTHOR_ID,
            authorTable.NAME,
            bookTable.TITLE.as("infos.title"), 
            bookTable.DESC.as("infos.desc")
        )
        .from(authorBookTable)
        .join(bookTable).on(bookTable.ID.eq(authorBookTable.BOOK_ID))
        .join(authorTable).on(authorTable.ID.eq(authorBookTable.AUTHOR_ID))
        .where(authorBookTable.AUTHOR_ID.eq(myAuthorId));

        try (final ResultSet resultSet = query.fetchResultSet()) {
            
            return JdbcMapperFactory
                .newInstance()
                .newMapper(AuthorDto.class)
                .stream(resultSet)
                .collect(toList());

         } catch (final SQLException e) {
             // ...
         }

}
protected <T> List<T> groupingFetch(final Select<?> query, final Class<? extends T> type) {

    try (final ResultSet resultSet = query.fetchResultSet()) {

        return JdbcMapperFactory
            .newInstance()
            .newMapper(type)
            .stream(resultSet)
            .collect(toList());
    
    } catch (final SQLException e) {
        // ...
    }
}
json_arrayagg(json_object(key ? value ...))