2009-10-28 44 views
17

Tôi đang sử dụng iBATIS để tạo các câu lệnh chọn. Bây giờ tôi muốn thực hiện các câu lệnh SQL sau đây với iBATIS:Cách sử dụng mệnh đề IN trong iBATIS?

SELECT * FROM table WHERE col1 IN ('value1', 'value2'); 

Với cách tiếp cận sau, báo cáo kết quả không được chuẩn bị một cách chính xác và không có lợi nhuận kết quả:

SELECT * FROM table WHERE col1 IN #listOfValues#; 

iBATIS dường như cơ cấu lại danh sách này và cố gắng diễn giải nó như một chuỗi.

Làm cách nào để sử dụng mệnh đề IN chính xác?

Trả lời

31

Dưới đây là một bài viết trên blog rằng câu trả lời câu hỏi của bạn:

iBatis: Support for Array or List Parameter with SQL IN Keyword

<select id="select-test" resultMap="MyTableResult" parameterClass="list"> 
select * from my_table where col_1 in 
    <iterate open="(" close=")" conjunction=","> 
    #[]# 
    </iterate> 
</select> 

Và trong Java bạn nên vượt qua trong một java.util.List . Ví dụ.

List<String> list = new ArrayList<String>(3); 
list.add("1"); 
list.add("2"); 
list.add("3"); 
List objs = sqlMapClient.queryForList("select-test",list); 
+0

tất cả xml này khiến tôi muốn nôn mửa, nhưng thx cho thông tin rất hữu ích cho một dự án mà tôi phải sử dụng ibatis – Rick

+2

Tôi không thể tin rằng tôi chỉ upvoted một câu hỏi/câu trả lời iBatis. Khi nào dự án này kết thúc, và tôi có thể ngừng sử dụng iBatis? –

+1

Không, iBatis thật tuyệt vời. Ít nhất bạn có thể viết SQL thay vì một số abomination khác. –

11

Làm thế nào về

<select id="foo" parameterClass="Quuxly" resultClass="Flobitz"> 
    select * from table 
    <dynamic prepend="where col1 in "> 
     <iterate property="list_of_values" open="('" close="')" conjunction=", "> 
      #list_of_values[]# 
     </iterate> 
    </dynamic> 
</select> 
+0

Cảm ơn, tôi quá ngu ngốc để nghiên cứu, nó trông như thế nào. – guerda

+0

Cảm ơn, bạn đã cứu mạng sống của tôi: D – glider

4

Hoặc:

<select id="select-test" resultMap="MyTableResult" parameterClass="list"> 
select * from table where 
<iterate property="list" conjunction="OR"> 
    col1 = #list[]# 
</iterate> 
</select> 
-1

Bạn có thể sử dụng nó như thế này:

<select id="select-test" resultMap="MyTableResult" > 
select * from my_table where col_1 in 
$listOfValues$ 
</select> 

sử dụng $ trong báo cáo IN.

+0

điều này tạo ra một cái gì đó như [aaa, abb, acc] bạn có thể đề nghị làm thế nào tôi có thể thay đổi mặc định này '[]' thành '()' vì oracle không hỗ trợ '[]' – Saif

0
<select id="select-test" parameterClass="list"resultMap="YourResultMap"> 
    select * from table where col_1 IN 
    <iterate open="(" close=")" conjunction=","> 
     #[]# 
    </iterate> 
</select> 
+1

Chăm sóc để bình luận mã của bạn? Nếu có một câu trả lời được chấp nhận từ 2 năm trước với 9 upvotes, câu trả lời của bạn cho biết thêm rằng quan trọng mà có thể là một câu trả lời hữu ích? – Yaroslav

0

Một câu hỏi cũ, nhưng đối với những người sử dụng MyBatis, cú pháp là một chút khác nhau:

<select id="selectPostIn" resultType="domain.blog.Post"> 
    SELECT * 
    FROM POST P 
    WHERE ID in 
    <foreach item="item" index="index" collection="list" 
     open="(" separator="," close=")"> 
     #{item} 
    </foreach> 
</select> 

Tham khảo guide in here.

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