2010-03-17 9 views
0

어디서나 NOT BETWEEN date1 AND date2 where와 동등한 수를 처리 할 수있는 단일 JDBC 문을 작성하고 싶습니다.jdbc 쿼리 - 날짜 범위를 매개 변수로 사용

단일 쿼리는 동일한 SQL 문자열을 사용하여 JDBC 문을 만든 다음 다른 매개 변수를 제공한다는 의미입니다.

이렇게하면 기본 프레임 워크가 쿼리를 효율적으로 캐시 할 수 있습니다. (이전에 봤던 적이 있습니다.)

SELECT * FROM table WHERE mydate NOT BETWEEN ? AND ? 

이상의 매개 변수

:

기본적으로, 나는

SELECT * FROM table WHERE mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 

의 동일하며 같은 시간에 적은 수의 매개 변수와 함께 사용할 수있는 쿼리를 찾으려면

SELECT * FROM table WHERE mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 
    AND mydate NOT BETWEEN ? AND ? 

임시 테이블을 사용하는 것이 더 간단하고 효율적이라면 고려해 보겠습니다.

도움 주셔서 감사합니다!

답변

3

준비된 명령문에는 고정 된 양의 매개 변수가 있습니다. 어떤 경우에는 (IN()처럼) array를 사용하여이 문제를 극복 할 수 있지만, 그렇지 않은 경우에는 작동하지 않을 수 있습니다.

임시 테이블이 작업을 수행합니다. 임시 테이블에 "startdate"및 "enddate"열이있는 경우 ON (mydate BETWEEN startdate AND enddate)에 가입하십시오. 임시 테이블에서 행을 삽입 및 삭제하면 매개 변수의 양이 변경됩니다.

+0

배열은'IN'에서 작동하지 않습니다. 여전히 자리 표시자를 자동 생성해야합니다. – BalusC

+0

배열 작업은 훌륭하지만 IN을 ANY (?)로 변환해야합니다. 매개 변수로 '{1,2,3}'문자열을 보내면 제대로 작동합니다. –

2

즉시 SQL 문자열을 생성하면됩니다. 예 :

public List<Data> find(List<BetweenDate> betweenDates) throws SQLException { 
    StringBuilder sql = new StringBuilder("SELECT * FROM table WHERE "); 
    for (int i = 0; i < betweenDates.size();) { 
     sql.append("mydate NOT BETWEEN ? AND ?"); 
     if (++i < betweenDates.size()) sql.append(" AND "); 
    } 

    Connection connection = null; 
    PreparedStatement statement = null; 
    ResultSet resultSet = null; 
    List<Data> result = new ArrayList<Data>(); 

    try { 
     connection = database.getConnection(); 
     statement = connection.prepareStatement(sql.toString()); 
     for (int i = 0; i < betweenDates.size(); i++) { 
      preparedStatement.setObject((i * 2) + 1, betweenDates.get(i).getStartDate()); 
      preparedStatement.setObject((i * 2) + 2, betweenDates.get(i).getEndDate()); 
     } 
     resultSet = statement.executeQuery(); 
     // ... 
관련 문제