与 JDBI 3 创建多对一 (n:1) / 一对一 (1:1) 关系
Create many-to-one (n:1) / one-to-one (1:1) relationship with JDBI 3
主题说明了一切:我有一个 1:1 关系,从技术上讲这是一个多对一的关系,但我希望两者的处理方式相同。该关系是一个状态列,其中包含另一个 table 的主键和状态代码。 SQL 查询再简单不过了:
SELECT * FROM User LEFT OUTER JOIN status USING (status_id)
我能找到的所有关于连接的 JDBI 示例似乎都期望使用 CollectionS
进行更复杂的连接,而我只是想返回 UserS
,看起来像这样:
class User {
String name;
Status status;
}
class Status {
int code;
}
在此示例中,tables 将是 User(VARCHAR name, INT status_id)
、Status(INT status_id, INT code)
。
作为额外的后续问题,状态代码是(相对)静态的,因此生成一个与 Status
table 匹配的枚举 class 似乎是个好主意。我看到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();
}
请注意,虽然在此示例中,我已明确使用加入的名称 table,但我不必如此。如果您没有重叠的列名,那么示例可以简化为:
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;
}
主题说明了一切:我有一个 1:1 关系,从技术上讲这是一个多对一的关系,但我希望两者的处理方式相同。该关系是一个状态列,其中包含另一个 table 的主键和状态代码。 SQL 查询再简单不过了:
SELECT * FROM User LEFT OUTER JOIN status USING (status_id)
我能找到的所有关于连接的 JDBI 示例似乎都期望使用 CollectionS
进行更复杂的连接,而我只是想返回 UserS
,看起来像这样:
class User {
String name;
Status status;
}
class Status {
int code;
}
在此示例中,tables 将是 User(VARCHAR name, INT status_id)
、Status(INT status_id, INT code)
。
作为额外的后续问题,状态代码是(相对)静态的,因此生成一个与 Status
table 匹配的枚举 class 似乎是个好主意。我看到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();
}
请注意,虽然在此示例中,我已明确使用加入的名称 table,但我不必如此。如果您没有重叠的列名,那么示例可以简化为:
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;
}