使用JDBI 3创建多对一(n:1)/一对一(1:1)关系

时间:2018-08-14 15:25:12

标签: 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,但我不知道如何使用它。

1 个答案:

答案 0 :(得分:3)

该解决方案原来是@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;
}