2012-01-06 23 views
15

Có một truy vấn trong Mybatis của tôi có chứa một điều khoản trong đó về cơ bản là một tập hợp của Id của (Số nguyên)Làm thế nào để vượt qua một Integer Array khoản IN MyBatis

Tôi bây giờ bị mắc kẹt trên làm thế nào tôi có thể vượt qua một Integer mảng đến mệnh đề IN này để nó kéo lên các bản ghi thích hợp. Bằng cách truyền một String chứa ID tới mệnh đề IN, nhưng điều này không hoạt động như mong đợi.

Mã mẫu bên dưới

Mybatis Phương pháp sử dụng chú thích

@Select(SEL_QUERY) 
    @Results(value = {@Result(property="id",column="ID")}) 
    List<Integer> getIds(@Param("usrIds") Integer[] usrIds); 

Query

select distinct ID from table a where a.id in (#{usrIds}) 

Method Gọi

Integer[] arr = new Integer[2]; 
arr[0] = 1; 
arr[1] = 2; 

mapper.getIds(arr) 

này không hoạt động, Mybatis ném một wh lỗi en Tôi gọi phương thức mapper

Mọi góp ý xin vui lòng

Trả lời

26

Các myBatis User Guide on Dynamic SQL có một ví dụ về cách sử dụng một vòng lặp foreach để xây dựng chuỗi truy vấn, mà làm việc cho các danh sách và mảng.

Trước khi phát hành 3.2, bạn phải sử dụng cấu hình xml để sử dụng sql động, với các phiên bản mới hơn, bạn cũng có thể sử dụng dynamic sql in annotations.

<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> 
+0

Cảm ơn mẹo, tôi sẽ kiểm tra và cập nhật không gian tại đây – Vivek

+1

Thực ra, nó cũng hoạt động với các chú thích miễn là bạn bắt đầu chuỗi truy vấn bằng '

3

CÓ, bạn có thể làm điều đó bằng chú thích.

Nếu bạn đang sử dụng postgresql, bạn có thể thực hiện như in this post.

Nếu bạn đang sử dụng MySQL thử điều này thay đổi trong mẫu mã của bạn:

Mybatis Phương pháp sử dụng chú thích

@Select(SEL_QUERY) 
    @Results(value = {@Result(property="id",column="ID")}) 
    List<Integer> getIds(@Param("usrIds") String usrIds); 

Query (sử dụng MySQL)

select distinct ID from table a where FIND_IN_SET(a.id, #{usrIds}) <> 0 

Phương pháp gọi

Integer[] arr = new Integer[2]; 
arr[0] = 1; 
arr[1] = 2; 

String usrIds= ""; 
for (int id : ids) { 
    usrIds += id + ","; 
} 

mapper.getIds(usrIds) 
+0

chính xác những gì tôi cần – deeshank

+1

Một lưu ý có giá trị ở đây là FIND_IN_SET sẽ không sử dụng các chỉ mục để phiên bản này có khả năng hoạt động kém hơn một câu lệnh IN – Zack

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