2009-07-21 27 views
10

Tôi đang sử dụng SimpleJdbcTemplate và MapSqlParameterSource theo cách folowing:SimpleJdbcTemplate và null thông số

MapSqlParameterSource parameterSource = new MapSqlParameterSource(); 
parameterSource.addValue("typeId", typeId, Types.BIGINT); 

List<Long> ids = _jdbcTemplate.query(_selectIdByParameters, new EntityIdRowMapper(), parameterSource); 

Khi typeId (mà là một Long) là null, sau đó truy vấn trông theo cách sau:

SELECT id FROM XXX WHERE typeId = null 

trong khi tôi hy vọng nó sẽ tạo ra

SELECT id FROM XXX WHERE typeId IS NULL 

Tôi đã reported this issue và câu trả lời là

Bạn sẽ phải cung cấp câu lệnh SQL thích hợp dựa trên các tham số truy vấn của mình.

và hậu quả là mã của tôi được phân phối bằng séc rỗng.

Có cách nào thanh lịch hơn để xử lý các tham số null được gửi đến SimpleJdbcTemplate không?

Trả lời

6

Chúng có điểm - JdbcTemplate không phải là trình thông dịch SQL, nó chỉ thay thế trình giữ chỗ của bạn.

Tôi đề nghị bạn xây dựng khoản của bạn với một phương pháp hữu ích, và concat nó vào chuỗi truy vấn:

String createNullCheckedClause(String column, Object value) { 
    String operator = (value == null ? "is" : "="); 
    return String.format("(%s %s ?)", column, operator); 
} 

... 

String query = "select * from table where " + createNullCheckedClause("col", x); 

Không rất đẹp. Ngoài ra, có lẽ bạn có thể cấu hình MySQL để cho phép "= NULL", nhưng tôi không nghĩ đó là một lựa chọn.

+0

Nó có hoạt động không, nếu namedparameterjdbctemplate được sử dụng thay vì simplejdbctemplate? –

Các vấn đề liên quan