使用 JOOQ 获取内部有对象的对象

Fetch an object that has a object inside using JOOQ

提问人:Eduardo B. 提问时间:10/27/2023 最后编辑:Mark RotteveelEduardo B. 更新时间:10/27/2023 访问量:35

问:

我的数据库中有这个关联

用户(1) <----------->项目(n)

我正在尝试将数据提取到单个对象中

dsl.select()
    .from(PROJECT.join(USERS)
    .on(USERS.ID.eq(PROJECT.ID_USERS))).where(PROJECT.ID.eq(id))
    .fetchOneInto(ProjectEntity.class)

这是用户

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UserEntity {
    
    private int id;
    private String username;
    private String password;
    private String email;
    //private List<ProjectEntity> projects;   

}

这是我的 ProjectEntity:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ProjectEntity {
    
    private Integer id;
    private String name;
    private String description;
    private String location;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    private LocalDateTime creationDate;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    private LocalDateTime lastModifiedDate;
    private Integer idUsers;
    
}

当我尝试检索对象时,出现以下错误:

org.jooq.exception.DataTypeException:未找到类型的转换器 java.lang.Integer 和 com.xmobots.domain.entities.UserEntity

为什么会发生这种情况,我该如何解决?

Java Jooq

评论

0赞 Lukas Eder 10/27/2023
我不确定为什么会发生您的特定错误。您似乎没有提供重现此错误所需的所有信息(也许您没有,但只投影了一列?select()

答:

1赞 Lukas Eder 10/27/2023 #1

在 jOOQ 中获取多对多关系的最佳方法是使用 MULTISET 运算符。它为映射添加了类型安全性,并允许投影任意级别的嵌套:

List<UserEntity> list =
dsl.select(
        USERS.ID,
        USERS.USERNAME,
        USERS.PASSWORD, // Not convinced you want to project this, though?
        USERS.EMAIL
        multiset(
            select(
                PROJECT.ID,
                PROJECT.NAME,
                PROJECT.DESCRIPTION,
                PROJECT.LOCATION,
                PROJECT.CREATION_DATE,
                PROJECT.LAST_MODIFIED_DATE
            )
            .from(PROJECT)
            .where(PROJECT.ID_USERS.eq(USERS.ID))
        ).convertFrom(r -> r.map(Records.mapping(ProjectEntity::new)))
    )
    .from(USERS)
    .where(USERS.ID.eq(1))
    .fetch(Records.mapping(UserEntity::new));

如果您认为这更快/更适合您的情况,您也可以使用您的,在这种情况下,您可以使用MULTISET_AGG嵌套集合。此替代方法将起作用,因为您只有 1 个嵌套集合。JOIN