java - 使用 JDBI 3 创建多对一 (n:1) / 一对一 (1:1) 关系
问题描述
主题说明了一切:我有一个 1:1 的关系,这在技术上是多对一的关系,但我希望两者的处理方式相同。该关系是一个状态列,它包含另一个表的主键和状态代码。SQL 查询再简单不过了:
SELECT * FROM User LEFT OUTER JOIN status USING (status_id)
我能找到的所有关于 join 的 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;
}
推荐阅读
- vba - 在Excel宏中复制粘贴功能时如何分配负号
- javascript - html元素上的引导模式附加缺少的css
- android - 无法解决 gradle build szagurskii
- linux - 我正在尝试 grep 文件夹并将结果变量作为进一步需要
- haskell - 使用 getArgs 或用户输入
- php - get_call_class() 和 static::class 之间的区别
- jquery - jquery中的禁用和启用按钮
- google-analytics - 如何使用 Google 跟踪代码管理器发送 ga(...) 事件?
- c# - ListView 下方的 WPF 按钮 - 当 ListView 太大时消失
- protractor - 自动化 webrtc 屏幕共享