簡體   English   中英

僅返回特定字段

[英]return only specific fields

String sql = "SELECT " + columnList + " FROM result"; 

List<Result> result = jdbcTemplate.query(sql, new ResultRowMapper());

結果類有很多字段。 我只想返回在JSON的列列表中指定的那些字段,無論是否為null。 我想出的解決方案是使用列列表中的字段動態創建一個臨時類,然后像下面這樣使用它:

List<TempClass> result = jdbcTemplate.query(sql, new ResultRowMapper());

關於如何創建此Temp類的任何建議? 字段將根據用戶輸入而更改。

謝謝你的時間。

從上面的查詢和注釋中,您可以表明SELECT子句中的列列表是動態的,這意味着即使RowMapper也將基於該列表進行更改。

讓我們創建一個ResultRowMapper接口,它擴展了org.springframework.jdbc.core.RowMapper ,如下所示:

public interface ResultRowMapper extends RowMapper<Person> {
    default List<String> getColumnList(){
        return Arrays.asList("id", "first_name", "last_name", "dob", "place_of_birth", "address");
    }

    default String getColumnListAsString(){
        return getColumnList().stream().collect(Collectors.joining(", "));
    }


    @Override
    default Person mapRow(ResultSet resultSet, int i) throws SQLException {
        Person p = new Person();
        p.setId(resultSet.getLong("id"));
        p.setFirstName(resultSet.getString("first_name"));
        p.setLastName(resultSet.getString("last_name"));
        p.setAddress(resultSet.getString("address"));
        p.setPlaceOfBirth(resultSet.getString("place_of_birth"));
        return p;
    }
}

然后,根據我們的需求,將為此ResultRowMapper接口創建不同的實現:

@Component("DefaultResultRowMapper")
public class DefaultResultRowMapper implements ResultRowMapper {
}

@Component("NameResultRowMapper")
public class NameResultRowMapper implements ResultRowMapper {
    @Override
    public List<String> getColumnList(){
        return Arrays.asList("id", "first_name", "last_name");
    }


    @Override
    public Person mapRow(ResultSet resultSet, int i) throws SQLException {
        Person p = new Person();
        p.setId(resultSet.getLong("id"));
        p.setFirstName(resultSet.getString("first_name"));
        p.setLastName(resultSet.getString("last_name"));
        return p;
    }
}

@Component("AddressResultRowMapper")
public class AddressResultRowMapper implements ResultRowMapper {
    @Override
    public List<String> getColumnList(){

        return Arrays.asList("id", "dob", "place_of_birth", "address");
    }


    @Override
    public Person mapRow(ResultSet resultSet, int i) throws SQLException {
        Person p = new Person();
        p.setId(resultSet.getLong("id"));
        p.setAddress(resultSet.getString("address"));
        p.setPlaceOfBirth(resultSet.getString("place_of_birth"));
        return p;
    }
}

然后,在Spring Boot應用程序中,我將通過以下方式使用它:

@Slf4j
@SpringBootApplication
public class CustomRowMapperApplication implements ApplicationRunner {

    @Autowired @Qualifier("NameResultRowMapper")
    ResultRowMapper nameResultRowMapper;

    @Autowired @Qualifier("DefaultResultRowMapper")
    ResultRowMapper defaultResultRowMapper;

    @Autowired @Qualifier("AddressResultRowMapper")
    ResultRowMapper addressResultRowMapper;

    @Autowired
    JdbcTemplate jdbcTemplate;
    public static void main(String[] args) {
        new SpringApplication(CustomRowMapperApplication.class).run(args);
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        List<Person> peopleWithName = jdbcTemplate.query("SELECT " + nameResultRowMapper.getColumnListAsString() 
                + " FROM person", nameResultRowMapper);
        log.info("People with name: {} ", peopleWithName);

        List<Person> people = jdbcTemplate.query("SELECT " + defaultResultRowMapper.getColumnListAsString() 
                + " FROM person", defaultResultRowMapper);
        log.info("People with all detail: {} ", people);

        List<Person> peopleWithAddress = jdbcTemplate.query("SELECT " + addressResultRowMapper.getColumnListAsString() 
                + " FROM person", addressResultRowMapper);
        log.info("People with address: {} ", peopleWithAddress);


    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM