2013-04-07 6 views
2

ID 집합에 대해 일치하는 행을 반환하는 쿼리를 사용하여 Anorm을 사용하여 결과 목록을 반환하려고합니다. 예 :Play Framework 2.0 Anorm을 사용하여 쿼리에서 집합을 나타내는 올바른 방법

select * 
from example 
where id in (1,2,3,4,5) 

나는 ID가 문자열 "1,2,3,4,5"입니다

SQL(
    """ 
     select * 
     from example 
     where id in ({ids}) 
    """ 
).on('ids -> ids).as(int("id") ~ str("name") *) 

를하려고하면 그것은 단지 첫 번째 행을 반환합니다. 일련의 ID를 주입하는 올바른 방법은 무엇입니까?

답변

5

AFAIK를 수행하는 간단한 방법은 없습니다.

내가 그것을 해결하는 방법입니다

def findSomething(ids: String) = { 
    // Split up the comma separated values 
    val sids = ids split "," 
    // Create a list of keys (id0, id1, id2, ...) 
    val keys = for (i <- 0 until sids.size) yield ("id" + i) 
    // Create a seq of parameterized values 
    val values = sids map (toParameterValue(_)) 

    // Now zip together the keys and values into list of tuples 
    val params = keys zip values 

    DB.withConnection { implicit connection => 
    SQL(
     """ 
     select * 
     from example 
     where id in ({%s}) 
     """.format(keys.mkString("},{")) 
    ).on(
     params: _* 
    ).as(
     int("id") ~ str("name") * 
    ) 
    } 
} 

NB
cruical 부분은 여기에 SQL 문에 서식 문자열입니다. 입력 매개 변수를 완전히 제어 할 수없는 경우 SQL 주입에 취약합니다.

+0

좋아요! 정보를 제공해 줘서 고마워, 내가 어쨌든 잘못하고있는 것처럼 느껴졌다. –

+0

고마워요,하지만 여전히 조금 미친 짓이며 매개 변수화 된 시퀀스를 지원해야합니다. 문자열로 "scala noob expected-to-work"바인딩 기법을 사용하면 로거에서 완벽하게 유효한 SQL이 생성되지만 자동으로 실패한다는 사실은 말할 필요도 없습니다. – Brian

+0

@notbrain Play 개발자 팀 (여기) (https://groups.google.com/forum/?fromgroups=#!topic/play-framework/meYkd-KKQRE)에서 여러 번 논의되었습니다. [여기 ] (http://play.lighthouseapp.com/projects/82401/tickets/188-make-in-clause-in-anorm-easier) 및 [여기] (https://groups.google.com/forum/? fromgroups = #! topic/play-framework/BNFvma2vu5U)를 먼저 읽어보십시오. 하지만이 문제가 해결되어야한다는 것에 전적으로 동의합니다. 여기서 나의 대답은 웜과 IN 절의 단점을 극복하는 한 가지 방법 일뿐입니다. – maba