我有以下 DTO:
产品DTO
用户DTO
用户角色DTO:
我需要获取产品列表,每个产品都有一个字段“creatorId”(可为空)。
产品 -> 1:1 -> 用户 -> 1:N -> 用户角色
我让它与以下 jooq 查询一起使用:
dsl()
.select(
asterisk(),
multiset(
selectDistinct(
asterisk()
)
.from(UserRole.USER_ROLE)
.where(UserRole.USER_ROLE.USERID.eq(Product.PRODUCT.CREATORID))
).as("roles")),
.from(Product.PRODUCT)
.leftJoin(User.USER)
.on(User.USER.USERID.eq(Product.PRODUCT.CREATORID))
.where(...)
.groupBy(Product.PRODUCT.PRODUCTID)
.orderBy(...)
.offset(...)
.limit(...)
.fetch().map(new RecordMapper<Record, ProductDTO>() {
@Override
public @Nullable ProductDTO map(Record record) {
ProductDTO product = rec.into(ProductDTO.class);
UserDTO creator = rec.into(UserDTO.class);
List<UserRoleDTO> creatorRoles = rec.get("roles", Result.class).into(UserRoleDTO.class);
creator.setRoles(creatorRoles);
product.setCreator(creator);
return product;
}
});
现在我的问题:
在没有显式“RecordMapper”部分的情况下,这种映射也可以“隐式”吗?
我已经很满意我能做到这一点,因为我只找到了使用具有直接 1:N 关系的多重集的示例,但我这里拥有的是 1:1 关系,(在更深层次上)还包含 1:N 关系.
通常可以创建两个单独的 SELECT 语句,但对于我的用例(带过滤的远程分页),所有这些都是必要的!关系在一个 SELECT 语句中处理,因此我可以使用连接语句对查询进行额外过滤。
在 Lukas Eder 的帮助下(见上文)和临时转换器的链接示例页面(请参阅:https://www.jooq.org/doc/latest/manual/sql-execution/fetching/ad-hoc -converter/)我已经“隐式”解决了多集案例(不需要后处理 RecordMapper)。
multiset(
selectDistinct(
asterisk()
)
.from(UserRole.USER_ROLE)
.where(UserRole.USER_ROLE.USERID.eq(Product.PRODUCT.CREATORID))
).as("roles").convertFrom(r -> r.into(UserRole.USER_ROLE).into(UserRoleDTO.class)),
1:1(创作者)关系的另一个案例仍然悬而未决。我仍在努力寻找一种方法来使用具有这种 1:1 关系的临时映射器。
我尝试以下操作但没有成功,因为它产生了 sql 错误:
select(
...
asterisk(),
User.USER.convertFrom(r -> into(User.USER).into(UserDTO.class)).as("creator"),
multiset(...),
...
)
Caused by: java.sql.SQLSyntaxErrorException: (conn=2014) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '.userId,
testshop.user.clientId as v20.clientId,
testshop.user.email ...' at line 24