2013-08-23 4 views
0

요청 매개 변수에서 preparedStatement.setObject()로 오는 String List를 단일 매개 변수로 전달하려고합니다. 여기에 Object of 목록이 있습니다. 단일 문자열.preparedStatement.setObject() 내에서 하나의 매개 변수로 문자열 목록을 전달하지 않음

변환 된 String을 setObject 메소드에 전달하는 동안 'to \'로 변환 중입니다. sqlParams.get (카운터) 나에게 다음과 같은 값을주고 여기

select * from category where category IN (?) 

    for (int counter = 0; (!sqlParams.isEmpty()) && counter < sqlParams.size(); counter++) { 
    System.out.println(sqlParams.get(counter)); 
    stmt.setObject(counter + 1, sqlParams.get(counter)); 
    System.out.println(stmt.toString()); 
} 

: 같은

그래서 내 쿼리입니다.

: 쿼리 형성에

'\'Adult\', \'Classic\', \'Fantasy\', \'Mystery\'' 

그래서이 같은 것입니다 : 내가 stmt.setObject()를 사용하고 stmt를의 값을 인쇄하고

'Adult', 'Classic', 'Fantasy', 'Mystery' 

하지만 원자바오, 그것은 다음과 같은 값을 보여주고있다

SELECT * FROM mytable WHERE category IN ('Adult\', \'Classic\', \'Fantasy\', \'Mistry\''); 

개별적인 String 전달 및 각 개별 String에 대한 쿼리 실행과 같은 이러한 접근 방식을 해결하는 다른 방법이 있습니다. 그러나 내 코드의 시간 복잡성이 증가합니다. 아무도 나에게 해결책을 제안 할 수 있습니까?

+2

왜'PreparedStatement.toString()'의 반환 값에 신경 쓰나요? "내 코드의 시간 복잡성이 증가하고 있습니다"라는 의미는 무엇입니까? 이 루프가 코드에서 병목 현상이 발생하면 나는 놀라워 할 것입니다. 다른 한편으로는, 나는 당신의 코드가 당신이 원하는 것을 실제로하지 않는다고 생각한다 - 당신은 당신의 SQL에 하나의 매개 변수만을 지정하고 있지만, 다중 매개 변수 값을 설정하고있다 ... –

+1

[PreparedStatement IN 절 대안?] (http://stackoverflow.com/questions/178479/preparedstatement-in-clause-alternatives) 그리고 "시간 복잡성"을 극복하십시오. 어떤 의미가 없습니다. – BalusC

+0

Java의 시간 복잡도는 성능과 거의 같습니다. –

답변

3

매개 변수 개수가 가변적 인 경우 JDBC 준비 문을 사용할 수 없습니다 (예 : 여기와 같이). ? 쿼리에서 여러 값을 쉼표로 구분하지 않고 단일 값으로 확장합니다.

당신이 할 수있는 일은 적절한 수의? s로 SQL을 구성한 다음 루프에서 각 매개 변수를 설정하는 것입니다.

+0

나는 동일한 해결책을 생각해 냈다. 그러나 문제는 내 목록의 개체 수를 기반으로하는 쿼리에 "?"을 추가하기 위해 for 루프를 실행해야한다는 것입니다. 가능한 한 많은 시간 복잡성을 줄이고 싶습니다. – MankitaP

+1

StringBuilder를 사용하십시오. 시간 복잡도는 O (n)로 상각됩니다. 덜 불가능합니다. – Joni

+0

그리고 시간 복잡성을 줄이고 싶습니다. * o (n)이 불가능하다는 것을 잘 알고 있습니다.하지만 여전히이 솔루션은 DB를 여러 번 쿼리하는 것보다 낫다고 생각합니다 ... 감사합니다. – MankitaP