与JDBI 3建立多对一(n:1)/一对一(1:1)关系



>Topic说明了一切:我有一个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;
}