是否可以 return 自定义 Java 对象在 Spring 数据 JDBC 中组合多个聚合?
Is it possible to return custom Java objects combining multiple aggregates in Spring Data JDBC?
我有多个聚合 classes,例如 Request、Scribe、Candidate 和 Exam。
示例架构:
请求(id,scribe_id,candidate_id,exam_id,状态)
抄写员(身份证,姓名)
候选人(身份证,姓名)
考试(id、姓名、日程)
如您所见,Request
table 引用了 Scribe、Candidate 和 Exam table。
对于其中一项要求,我需要 return 基于条件的所有请求,包括抄写员、考生和考试的所有相应详细信息。
为此,我的存储库 class 中的查询将类似于以下内容:
SELECT r.id, r.status, c.name, s.name,
e.schedule, e.name
FROM request r
JOIN candidate c ON r.candidate=c.id
JOIN scribe s ON r.scribe=s.id
JOIN exam e ON r.exam=e.id
WHERE <some-condition>
现在,有没有办法将此查询的结果直接映射到自定义 Java 对象和 return Spring 数据 JDBC 中的相同对象?
我相信另一种选择是使用 Spring JDBC 模板。
很好奇,来自 Spring Data JDBC?
的开箱即用支持
谢谢。
我可以通过设置 org.springframework.data.jdbc.repository.query.Query
注释的 rowMapperClass
值来 return 自定义 Java 对象。为此需要为自定义 Java 对象定义 RowMapper。
更改类似于以下内容:
public class RequestResourceRowMapper implements RowMapper<RequestResource> {
@Override
public RequestResource mapRow(ResultSet resultSet, int rowNumber) throws SQLException { ... }
}
在存储库 class 中,需要设置 rowMapper
值。
@Query(value = """
SELECT r.id, r.status, c.name, s.name,
e.schedule, e.name
FROM request r
JOIN candidate c ON r.candidate=c.id
JOIN scribe s ON r.scribe=s.id
JOIN exam e ON r.exam=e.id
WHERE <some-condition>
""",
rowMapperClass = RequestResourceRowMapper.class)
List<RequestResource> searchRequestResources(...);
这甚至可以在不使用自定义行映射器的情况下实现,但在这种情况下,您将不得不为 table 中的列分配不同的名称。您可以定义一个简单的 class 并在其中定义所有字段,并且为了将 java 字段映射到 table 中的相应列,您可以使用 @Column 属性示例:
public class RequestData {
@Column("id")
private Integer requestId;
@Column("scribe_id")
private String scribeId;
@Column("candidate_id")
private Integer candidateId;
@Column("scribe_name")
private String scribeName;
@Column("candidate_name")
private String candidateName;
@Column("exam_name")
private String examName;
@Column("exam_schedule")
private String examSchedule;
}
但是,对于这种情况,您需要在整个架构中使用不同的列名,这在您的情况下可能是不可能的,因为您在多个架构中具有相同的列名。
我有多个聚合 classes,例如 Request、Scribe、Candidate 和 Exam。
示例架构:
请求(id,scribe_id,candidate_id,exam_id,状态)
抄写员(身份证,姓名)
候选人(身份证,姓名)
考试(id、姓名、日程)
如您所见,Request
table 引用了 Scribe、Candidate 和 Exam table。
对于其中一项要求,我需要 return 基于条件的所有请求,包括抄写员、考生和考试的所有相应详细信息。
为此,我的存储库 class 中的查询将类似于以下内容:
SELECT r.id, r.status, c.name, s.name,
e.schedule, e.name
FROM request r
JOIN candidate c ON r.candidate=c.id
JOIN scribe s ON r.scribe=s.id
JOIN exam e ON r.exam=e.id
WHERE <some-condition>
现在,有没有办法将此查询的结果直接映射到自定义 Java 对象和 return Spring 数据 JDBC 中的相同对象? 我相信另一种选择是使用 Spring JDBC 模板。 很好奇,来自 Spring Data JDBC?
的开箱即用支持谢谢。
我可以通过设置 org.springframework.data.jdbc.repository.query.Query
注释的 rowMapperClass
值来 return 自定义 Java 对象。为此需要为自定义 Java 对象定义 RowMapper。
更改类似于以下内容:
public class RequestResourceRowMapper implements RowMapper<RequestResource> {
@Override
public RequestResource mapRow(ResultSet resultSet, int rowNumber) throws SQLException { ... }
}
在存储库 class 中,需要设置 rowMapper
值。
@Query(value = """
SELECT r.id, r.status, c.name, s.name,
e.schedule, e.name
FROM request r
JOIN candidate c ON r.candidate=c.id
JOIN scribe s ON r.scribe=s.id
JOIN exam e ON r.exam=e.id
WHERE <some-condition>
""",
rowMapperClass = RequestResourceRowMapper.class)
List<RequestResource> searchRequestResources(...);
这甚至可以在不使用自定义行映射器的情况下实现,但在这种情况下,您将不得不为 table 中的列分配不同的名称。您可以定义一个简单的 class 并在其中定义所有字段,并且为了将 java 字段映射到 table 中的相应列,您可以使用 @Column 属性示例:
public class RequestData {
@Column("id")
private Integer requestId;
@Column("scribe_id")
private String scribeId;
@Column("candidate_id")
private Integer candidateId;
@Column("scribe_name")
private String scribeName;
@Column("candidate_name")
private String candidateName;
@Column("exam_name")
private String examName;
@Column("exam_schedule")
private String examSchedule;
}
但是,对于这种情况,您需要在整个架构中使用不同的列名,这在您的情况下可能是不可能的,因为您在多个架构中具有相同的列名。