弹簧数据中的多个列名称

时间:2018-02-08 09:19:11

标签: spring spring-data

型号

@Column(name="Desc", name="des", name="DS")
private String description;

如何提及列的多个名称?那么,如果有人发现它将值映射到描述?

1 个答案:

答案 0 :(得分:0)

  

如何提及列的多个名称?

你不能。数据库不允许列具有多个名称,因此您无法将多个列名称映射到类字段。

  

那么,如果有人发现它将值映射到描述?

如果您有多个存储过程在各自的结果集中返回" Desc" " des" " ds" 并且您需要将其映射到同一Java类 - 您需要定义不同的行映射器并在那里描述映射。

例如,假设您有SP1和SP2,并且您希望将这些结果集映射到ResultDto。 ResultDto看起来像:

public class ResultDto {
  private String name; //always maps to DB column "name"
  private String desc; //maps to different DB columns - "ds", "desc"
  //ommitted..
}

您可以定义基本行映射器并定义所有Stored Procs结果集的所有重叠字段的映射。

代码示例:

protected static abstract class BaseRowMapper implements RowMapper<ResultDto> {
   public abstract ResultDto mapRow(ResultSet rs, int rowNum) throws SQLException;

   protected void mapBase(ResultSet rs, ResultDto resultDto) throws SQLException {
      resultDto.setName(rs.getString("name")); //map all overlapping fields/columns here
   }
}

private static class SP1RowMapper extends BaseRowMapper {

  @Override
 public ResultDto mapRow(ResultSet rs, int rowNum) throws SQLException {
   ResultDto resultDto = new ResultDto();
   mapBase(rs, resultDto);
   resultDto.setDescription(rs.getString("ds"));
   return resultDto;
 }
}

private static class SP2RowMapper extends BaseRowMapper {

 @Override
 public ResultDto mapRow(ResultSet rs, int rowNum) throws SQLException {
   ResultDto resultDto = new ResultDto();
   mapBase(rs, resultDto);
   resultDto.setDescription(rs.getString("desc"));
   return resultDto;
 }
}

我不知道您如何调用存储过程,但如果您使用Spring SimpleJdbcCall,代码将如下所示:

new SimpleJdbcCall(datasource)
  .withProcedureName("SP NAME")
  .declareParameters(
     //Stored Proc params
   )
  .returningResultSet("result set id", rowMapperInstance);