2013-05-31 30 views
12

Tôi tự hỏi nếu/cách này là có thể, nếu có, tôi chắc chắn rằng mình cách khắc phục đơn giản mà tôi dường như không thể tìm raJDBI sử dụng @bind cho các biến trong các truy vấn bên trong dấu ngoặc kép

@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'") 
public Set<Things> getThings(@Bind("thingName", String thingName) 

Về cơ bản đối với ví dụ đồ chơi này, tôi đang cố gắng chọn một hàng có cột chứa [bất kỳ văn bản] thingName [anyText]. Khi sử dụng như trên, tôi nghĩ rằng các dấu nháy che biến bị ràng buộc để nó theo nghĩa đen tìm kiếm [bất kỳ văn bản] : thingName [anyText] và không phải biến ràng buộc của tôi.

Cảm ơn bạn trước, Madeline

+0

Bạn nên thay đổi câu trả lời chấp nhận giải pháp nối. Có một cách để làm điều này mà không cần thực hiện thay đổi mã có thể giới thiệu một lỗi. –

Trả lời

9

Nó dường như là trường hợp đó bạn phải thêm tỷ lệ phần trăm các '%' vào biến ràng buộc:

@SqlQuery("SELECT * FROM Table WHERE column LIKE :thingName") 
public Set<Things> getThings(@Bind("thingName") String thingName); // where thingName = "%" + thingName + "%" 

Xem thêm: https://groups.google.com/forum/?fromgroups#!topic/jdbi/EwUi2jAEPdk

Trích dẫn từ Brian McCallister

Sử dụng công cụ đóng sách: foo tạo một câu lệnh chuẩn bị và liên kết trong giá trị cho tên trong trường hợp này. Bạn cần% là một phần của giá trị bị ràng buộc, hoặc bạn không cần sử dụng các ràng buộc cho một câu lệnh đã chuẩn bị.

  • Tiếp cận 1 (an toàn hơn và nói chung là tốt hơn một): "chọn ... từ foo nơi tên như: Tên" và ràng buộc giá trị ("%" + tên)

  • Tiếp cận 2 (mà mở bạn lên đến sql injection):

"select ... from foo where name like '%'" và define ("name", name) (hoặc trong sql object, (@Define ("name") tên) - đặt tên như một chữ trong tuyên bố của bạn.

Điều quan trọng là ký tự% là một phần của giá trị mà bạn đang thử nghiệm, không phải là một phần của câu lệnh.

+0

Cảm ơn bạn đã trả lời! Đây là những gì tôi đã làm, tôi đã hy vọng có một cách tốt hơn trên mạng nhưng có vẻ như không. - Madeline – user2441922

+0

Câu trả lời dưới đây sử dụng thao tác nối là câu trả lời tốt hơn vì nó không yêu cầu thay đổi hợp lý. Nếu bạn đang sử dụng postgres, bạn có thể làm ''%' || : hạn || '%' –

16

tôi sử dụng concat bao vây đầu vào với dấu% trong khi vẫn sử dụng một biến ràng buộc để tránh SQL injection:

@SqlQuery("select * from atable where acolumn like concat('%',:thingName,'%')") 
public Set getNames(@Bind("thingName") String thingName); 
Các vấn đề liên quan