是否可以 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;

}

但是,对于这种情况,您需要在整个架构中使用不同的列名,这在您的情况下可能是不可能的,因为您在多个架构中具有相同的列名。