2012-01-06 4 views
15
에서 IN 절에 정수 배열을 전달하는 방법을

기본적으로 내가 지금은 정수 전달할 수있는 방법에 붙어 아이디의 (정수)의 설정MyBatis로

인 IN 절을 포함하는 내 MyBatis로의 쿼리가 배열을이 IN 절에 추가하여 적절한 레코드를 가져옵니다. ID가 들어있는 String을 IN 절로 전달하면이 절이 예상대로 작동하지 않습니다.

의 MyBatis 방법 사용하여 주석

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

쿼리 아래

코드 샘플

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

는 메서드 호출

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

mapper.getIds(arr) 
이 작동하지 않습니다

는 MyBatis로 오류 어를 던졌습니다 나는 매퍼 방법을

를 호출 도중 어떤 제안은

답변

26

myBatis User Guide on Dynamic SQL는리스트와 배열 작동 쿼리 문자열을 구축하기 위해 foreach 루프를 사용하는 방법에 대한 예제를 가지고하시기 바랍니다.

릴리스 3.2 이전에는 xml 구성을 사용하여 동적 SQL을 사용하고 새 버전에서는 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

팁을 주셔서 감사합니다. 여기를 살펴보고 여기에 공간을 업데이트하십시오. – Vivek

+1

실제로 쿼리 문자열이 '

3

예, 주석을 사용하여 가능합니다.

postgresql을 사용하는 경우 in this post처럼 할 수 있습니다.

당신이 MySQL을 사용하는 경우이이 코드 샘플에서 변경 시도 :

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

쿼리 (MySQL을 사용)

의 MyBatis 방법 사용하여 주석

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

메서드 호출

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

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

mapper.getIds(usrIds) 
+0

정확히 무엇이 필요합니까? – deeshank

+1

여기서 중요한 것은 FIND_IN_SET은 인덱스를 사용하지 않기 때문에이 버전은 IN 문보다 성능이 떨어질 수 있습니다. – Zack

관련 문제