java - 创建多对一(n :1)/one-to-one (1:1) relationship with JDBI 3

标签 java jdbi

主题说明了一切:我有一个 1:1 的关系,从技术上讲这是一个多对一的关系,但我希望两者的处理方式相同。该关系是一个状态列,其中包含具有状态代码的另一个表的主键。 SQL 查询再简单不过了:

SELECT * FROM User LEFT OUTER JOIN status USING (status_id)

我能找到的关于连接的所有 JDBI 示例似乎都期望使用 CollectionS 进行更复杂的连接,而我只是想返回看起来像这样的 UserS :

class User {
    String name;
    Status status;
}

class Status {
    int code;
}

在此示例中,表将是 User(VARCHAR name, INT status_id)Status(INT status_id, INT code)

作为一个额外的后续问题,状态代码是(相对)静态的,因此生成一个与 Status 表匹配的枚举类似乎是个好主意。我看到 JDBI 自带一个 EnumMapper,但我不知道如何使用它。

最佳答案

解决方案原来是@Nested 注解。为了将来引用,我发布了该示例的工作版本:

class User {
    String name;

    @Nested("status")
    Status status;
}

class Status {
    int code;
}

interface Dao {
    @SqlQuery("SELECT user.*, status.code AS `status_code` FROM user LEFT OUTER JOIN Status USING (status_id)
    @RegisterBeanMapper(User.class)
    List<User> getUsers();
}

请注意,虽然在此示例中,我已经明确指定了连接表的名称,但我不必如此。如果您没有重叠的列名,则示例可以简化为:

class User {
    String name;

    @Nested
    Status status;
}

class Status {
    int code;
}

interface Dao {
    @SqlQuery("SELECT * FROM user LEFT OUTER JOIN Status USING (status_id)
    @RegisterBeanMapper(User.class)
    List<User> getUsers();
}

最后,如果您使用 Lombok对于您的数据类,正确的语法是以下之一(取决于您是否需要显式列重命名):

@Data
class User {
    String name;

    @Setter(onMethod = @__(@Nested))
    Status status;
}

@Data
class User {
    String name;

    @Setter(onMethod = @__(@Nested("status")))
    Status status;
}

关于java - 创建多对一(n :1)/one-to-one (1:1) relationship with JDBI 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51844876/

相关文章:

java - 是否有像 Perl 5 的 Text::Unidecode 这样的 Java 库?

java - spring RESTful 服务工作正常,但抛出异常

java - 当 SQL 子句需要 "disappear"来表示退化情况时,有没有办法使用 @Bind 而不是 @Define?

java - @Bind 可以使用 JDBI 与枚举和其他任意类型一起使用吗?

java - 使用常量迭代两个类并将它们的字段加载到 HashMap 中

java - 一个算法的大O分析——求职面试

java - 在 maven 中看不到 spring-boot-starter-data-mongodb-reactive 和 spring-boot-starter-webflux 依赖项

java - 如何使用JDBI运行sql脚本文件

java - 如何使用 BindBeans 将字符串列表输入到 SQL

java - 如何将 jdbiFactory DAO 注入(inject) Dropwizard 命令?