2010-07-14 33 views
12

Tôi đang cố gắng sử dụng MapSqlParameterSource để tạo truy vấn sử dụng mệnh đề Like.Điều khoản giống như mùa xuân

Mã này giống như thế này. Hàm chứa nó nhận tên nameParam:

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE :pname "; 

String finalName= "'%" +nameParam.toLowerCase().trim() + "%'"; 

MapSqlParameterSource namedParams= new MapSqlParameterSource(); 

namedParams.addValue("pname", finalName); 

int count= this.namedParamJdbcTemplate.queryForInt(namecount, namedParams); 

Điều này không hoạt động chính xác, cho tôi khoảng từ 0-10 kết quả khi tôi nhận hàng nghìn. Về cơ bản, tôi muốn truy vấn cuối cùng trông giống như:

SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%name%' 

nhưng điều này rõ ràng là không xảy ra. Bất kỳ trợ giúp sẽ được đánh giá cao.

Edit:

Tôi cũng đã thử đặt '%' s trong SQL, như

String finalName= nameParam.toLowerCase().trim(); 

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:pname%' " 

;

nhưng điều này không hoạt động.

Trả lời

26

Bạn không muốn các dấu ngoặc kép quanh chuỗi finalName của bạn. với các tham số được đặt tên bạn không cần phải chỉ định chúng. Điều này sẽ làm việc:

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE :pname "; 
String finalName= "%" + nameParam.toLowerCase().trim() + "%"; 

MapSqlParameterSource namedParams= new MapSqlParameterSource(); 
namedParams.addValue("pname", finalName); 

int count= this.namedParamJdbcTemplate.queryForInt(namecount, namedParams); 
+1

Bạn là anh hùng của tôi. Cảm ơn rất nhiều. Tôi đã làm việc này trong một khoảng thời gian dài. – Chris

+2

làm thế nào về một số câu trả lời được chấp nhận tình yêu? – Jeff

+0

Lợi ích của việc ghép các ký hiệu% vào tham số vs trực tiếp đưa nó vào truy vấn sql của bạn là gì? CHỌN số (*) TỪ NGƯỜI CÓ LỚN (TÊN) THÍCH '%' +: pname + '%' –

0

Các bạn đã thử đặt thẻ hoang dã% trong chuỗi sql của bạn (không phải là giá trị biến ràng buộc bản thân):

String finalName= nameParam.toLowerCase().trim(); 
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:finalName%'"; 
+0

Bạn có thể đề xuất cách sửa đổi mã hiện có để tôi có thể sử dụng '?' trình giữ chỗ? Tôi không tin rằng bạn có thể sử dụng nó với một MapSqlParameterSource. Cảm ơn – Chris

+1

là 'LIKE%: pname%' hợp lệ? –

+0

Tôi đã thử điều đó. Nó cho tôi kết quả tương tự (có thể giống nhau). Tôi nghĩ rằng phải có một cái gì đó với dấu nháy đơn hoặc dấu '%' gây trở ngại cho truy vấn. – Chris

0

Chúng ta có thể sử dụng JdbcTemplate đơn giản thay vì NamedParamJdbcTemplate

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE ? "; 

String finalName= "%" +nameParam.toLowerCase().trim() + "%"; //Notes: no quote 

getJdbcTemplate().queryForInt(namecount, new Object[] {finalName}); 

Hy vọng nó sẽ hữu ích cho người sử dụng JdbcTemplate

1

Giải pháp này làm việc cho tôi. Tôi đặt "%" vào danh sách tham số Object []:

String sqlCommand = "SELECT customer_id, customer_identifier_short, CONCAT(RTRIM(customer_identifier_a),' ', RTRIM(customer_identifier_b)) customerFullName " 
     + " FROM Customer " 
     + " WHERE customer_identifier_short LIKE ? OR customer_identifier_a LIKE ? " 
     + " LIMIT 10"; 

List<Customer> customers = getJdbcTemplate().query(sqlCommand, new Object[] { query + "%", query + "%"}, new RowMapper<Customer>() { 

    public Customer mapRow(ResultSet rs, int i) throws SQLException { 

     Customer customer = new Customer(); 
     customer.setCustomerFullName(rs.getString("customerFullName")); 
     customer.setCustomerIdentifier(rs.getString("customer_identifier_short")); 
     customer.setCustomerID(rs.getInt("customer_id"));     

     return customer; 
    } 
}); 

return customers;