Java 将参数传递给mapRow

Java 将参数传递给mapRow,java,jdbc,spring-jdbc,jdbctemplate,Java,Jdbc,Spring Jdbc,Jdbctemplate,我需要向行映射器传递一个参数,因为我需要将时区应用于日期字段。目前这是我的代码: 查询: @Override public List<GCProjectMember> selectGCMembers(Long jobId,String timezone) { DataSource dataSource = DataSourceBeanBuilder.getClientDataSource(ClientContextHolder.getCustomerType

我需要向行映射器传递一个参数,因为我需要将时区应用于日期字段。目前这是我的代码:

查询:

@Override
    public List<GCProjectMember> selectGCMembers(Long jobId,String timezone) {

        DataSource dataSource = DataSourceBeanBuilder.getClientDataSource(ClientContextHolder.getCustomerType(),
                this.getClass().getName());
        this.setDataSource(dataSource);

        List<GCProjectMember> membersList = getJdbcTemplate().query(SELECT_GC_MEMBERS, new Object[] { jobId },
                new GCProjectMemberRowMapper());
        if (membersList.size() > 0) {
            return membersList;
        } else {
            return Collections.emptyList();
        }
    }
@覆盖
公共列表selectGCMembers(长作业ID、字符串时区){
DataSource DataSource=DataSourceBeanBuilder.getClientDataSource(ClientContextHolder.getCustomerType(),
这个.getClass().getName());
this.setDataSource(dataSource);
List membersList=getJdbcTemplate().query(选择_GC_MEMBERS,新对象[]{jobId},
新GCProjectMemberRowMapper());
如果(membersList.size()>0){
返回成员列表;
}否则{
返回集合。emptyList();
}
}
行映射器:

public class GCProjectMemberRowMapper extends BasicRowMapper implements RowMapper<GCProjectMember> {

    @Override
    public GCProjectMember mapRow(ResultSet rs, int rowNum) throws SQLException {
        GCProjectMember member = new GCProjectMember();
        ...
        if (hasColumn(rs, "sign_date")) {
            member.setSignDate(rs.getTimestamp("sign_date"));
        }

        ....
        return member;
    }

}
公共类GCProjectMemberRowMapper扩展基本RowMapper实现RowMapper{
@凌驾
公共GCProjectMember mapRow(结果集rs,int rowNum)引发SQLException{
GCProjectMember=新的GCProjectMember();
...
if(第列(rs,“签字日期”)){
成员。设置签名日期(rs.getTimestamp(“签名日期”);
}
....
返回成员;
}
}

如何将时区从查询传递到行映射器?

您可以在GCProjectMemberRowMapper内创建参数化构造函数,并在初始化对象时将时区值传递给它

public class GCProjectMemberRowMapper extends BasicRowMapper implements RowMapper<GCProjectMember> {

   private TimeZone timezone;

   public GCProjectMemberRowMapper(TimeZone timezone) {
     this.timezone = timezone
   }
   @Override
   public GCProjectMember mapRow(ResultSet rs, int rowNum) throws SQLException {
    GCProjectMember member = new GCProjectMember();
    ...
    if (hasColumn(rs, "sign_date")) {
        member.setSignDate(rs.getTimestamp("sign_date"));
    }
    // use timezone here
    ....
    return member;
}
公共类GCProjectMemberRowMapper扩展基本RowMapper实现RowMapper{
私人时区;
公共GCProjectMemberRowMapper(时区时区){
this.timezone=时区
}
@凌驾
公共GCProjectMember mapRow(结果集rs,int rowNum)引发SQLException{
GCProjectMember=新的GCProjectMember();
...
if(第列(rs,“签字日期”)){
成员。设置签名日期(rs.getTimestamp(“签名日期”);
}
//在这里使用时区
....
返回成员;
}
可以像这样更改调用代码

@Override
public List<GCProjectMember> selectGCMembers(Long jobId,String timezone) {

    DataSource dataSource = DataSourceBeanBuilder.getClientDataSource(ClientContextHolder.getCustomerType(),
            this.getClass().getName());
    this.setDataSource(dataSource);

    List<GCProjectMember> membersList = getJdbcTemplate().query(SELECT_GC_MEMBERS, new Object[] { jobId },
            new GCProjectMemberRowMapper(timezone));
    if (membersList.size() > 0) {
        return membersList;
    } else {
        return Collections.emptyList();
    }
}
@覆盖
公共列表selectGCMembers(长作业ID、字符串时区){
DataSource DataSource=DataSourceBeanBuilder.getClientDataSource(ClientContextHolder.getCustomerType(),
这个.getClass().getName());
this.setDataSource(dataSource);
List membersList=getJdbcTemplate().query(选择_GC_MEMBERS,新对象[]{jobId},
新的GCProjectMemberRowMapper(时区));
如果(membersList.size()>0){
返回成员列表;
}否则{
返回集合。emptyList();
}
}