主题说明了一切:我有一个 1:1 的关系,这在技术上是多对一的关系,但我希望两者都得到相同的处理。关系是一个状态列,它保存另一个带有状态代码的表的主键。SQL 查询再简单不过了:
SELECT * FROM User LEFT OUTER JOIN status USING (status_id)
Run Code Online (Sandbox Code Playgroud)
我能找到的关于 join 的所有 JDBI 示例似乎都期望与 的 join 复杂得多CollectionS,而我只想回到UserS这样的状态:
class User {
String name;
Status status;
}
class Status {
int code;
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,表将为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();
}
Run Code Online (Sandbox Code Playgroud)
请注意,虽然在这个例子中,我已经明确地使用了连接表的名称,但我不必如此。如果没有重叠的列名,则示例可以简化为:
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();
}
Run Code Online (Sandbox Code Playgroud)
最后,如果您将Lombok用于您的数据类,则正确的语法是以下之一(取决于您是否需要显式重命名列):
@Data
class User {
String name;
@Setter(onMethod = @__(@Nested))
Status status;
}
Run Code Online (Sandbox Code Playgroud)
或者
@Data
class User {
String name;
@Setter(onMethod = @__(@Nested("status")))
Status status;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |