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