2012-08-14 30 views
6

Tôi có một sql bằng văn bản trong một tập tin mapper MyBatis mà là một cái gì đó như thế này:truy cập public static string cuối cùng trong sql mybatis trong các tập tin mapper

<select id="somesql"> 
    select a,b,c from tbl_name where d = ? 
</select> 

Giá trị giữ chỗ cho d là vụ phải được một hằng số khai báo trong một tập tin gọi Constants.java như:

public static final String d = "d_value"; 

làm thế nào để thay thế giữ chỗ với giá trị mà không thực sự đi qua một tham số trong xây dựng <select>? Tôi đã thử #{com.pkg.name.Constants.d} nhưng nó không hoạt động.

Không có mã hóa cứng !!!

Trả lời

2

Với hành vi ngoài hộp của MyBatis, theo như tôi biết, bạn không thể.

Bạn có thể thử viết một interceptor for the ParameterHandler và tiêm các giá trị đó nhưng điều này không thể lúc nào cũng có thể vì bạn có thể chơi chỉ với hai phương pháp trên thông số xử lý:

  • getParameterObject mà trả về tham số đó là được gửi đến truy vấn (có thể là hằng số, Chuỗi, Bản đồ, đối tượng tùy chỉnh hoặc thậm chí là null vì trường hợp ví dụ của bạn mà bạn không gửi tham số)
  • setParameters nơi tôi đoán bạn có thể thử thiết lập tham số nếu bạn biết nó nằm ở đâu trên câu lệnh đã chuẩn bị (phần lớn thời gian bạn có thể không có).

Đề xuất của tôi là chuyển nó làm tham số cho truy vấn của bạn. Các tính năng đánh chặn của MyBatis không được tài liệu rất tốt, vì vậy bạn có thể không nhận được kết hợp làm việc chính xác ngay từ đầu và bạn có thể kết thúc với nhiều rắc rối hơn giá trị của nó.

3
<select id="getConvenienceStoreList" resultType ="Store"> 
    SELECT * FROM Store 
    WHERE type = ${@[email protected]_STORE} 
    ORDER BY id 
    LIMIT #{start}, #{limit} 
</select> 

tham khảo: http://qiita.com/ApplePedlar/items/12dc389cc32f3db5557a

+0

Trên thực tế, hoạt động này !! Nhưng lưu ý rằng giá trị được dán "nguyên trạng", không thoát, không có dấu ngoặc kép. Vì vậy, nếu bạn không sử dụng nó cho các con số, bạn ít nhất phải thêm dấu ngoặc kép. –

+0

Trên thực tế, chúng tôi đang thay thế bất kỳ thông số nào được chuyển thành người lập bản đồ bằng cách này, ngoại trừ thực tế, chúng tôi không chỉ sử dụng hằng số STATIC FINAL, mà còn có thể trực tiếp gọi một số phương thức tĩnh như sau: ${@foo.product.constant.StoreType @getWhereClausule()} – kensai

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