[英]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.