2017-12-13 18 views
0

내 코드는 현재 진행됩니다h2에 MySQL의 WHERE IN IN과 유사한 쿼리/절이 있습니까? 다음과 같이

public List<DeviceOrganizationMetadataHolder> getChildrenByParentId(List<String> parentIds) throws DeviceOrganizationDAOException { 
     List<DeviceOrganizationMetadataHolder> children = new ArrayList<>(); 
     Connection conn; 
     PreparedStatement stmt = null; 
     ResultSet rs = null; 
     DeviceOrganizationMetadataHolder deviceMetadataHolder; 
     String[] data = parentIds.toArray(new String[parentIds.size()]); 
     try { 
      conn = this.getConnection(); 
      String sql = "SELECT * FROM DEVICE_ORGANIZATION_MAP WHERE DEVICE_PARENT IN (?)"; 
      stmt = conn.prepareStatement(sql); 
      data = parentIds.toArray(data); 
      stmt.setObject(1, data); 
      rs = stmt.executeQuery(); 
      while (rs.next()) { 
       deviceMetadataHolder = this.loadOrganization(rs); 
       children.add(deviceMetadataHolder); 
      } 
     } catch (SQLException e) { 
      throw new DeviceOrganizationDAOException("Error occurred for device list with while retrieving children.", e); 
     } finally { 
      DeviceManagementDAOUtil.cleanupResources(stmt, rs); 
      return children; 
     } 
} 

그러나 나는 parentIds와 배열을 전달하려고 단위 테스트에서, null가 돌려 남아있다하더라도. 내가이에서 측정 할 수 다음 중 하나입니다

  1. 배열 데이터가 점점되지는 제대로 때문에 출력이 null로오고,를 참조하십시오.
  2. h2 또는 에 의해 지원되지 않는 경우 그 대신에 다른 구현이 필요합니다.

어디서 잘못 되었나요?

편집 - 비슷한 duplicate question에 태그가 지정되었습니다. StringBuilder와 루프를 사용하는 것이 좋겠지 만 쿼리 자체를 사용하여 더 명확한 방식으로 수행 할 수있는 답변을 찾고있었습니다. 즉, 목록 대신 배열로 매개 변수를 설정

+0

[IN 절에 매개 변수 목록이있는 PreparedStatement] 가능한 복제본 (https://stackoverflow.com/questions/3107044/preparedstatement-with-list-of-parameters-in-a-in-clause) –

답변

1

봅니다

stmt.setObject(1, Arrays.asList(data)); 
0

그것을 파악과

stmt.setObject(1, data); 

를 교체합니다.

issue이 정확한 문제에 대해 h2database GitHub에 게시되었습니다. 제안 된 수정 사항을 따르고 이 작동했습니다.! 다음과 같이 편집 한 후

코드는 다음과 같습니다 당신이 볼 수 있듯이

public List<DeviceOrganizationMetadataHolder> getChildrenByParentId(List<String> parentIds) throws DeviceOrganizationDAOException { 
     List<DeviceOrganizationMetadataHolder> children = new ArrayList<>(); 
     Connection conn; 
     PreparedStatement stmt = null; 
     ResultSet rs = null; 
     DeviceOrganizationMetadataHolder deviceMetadataHolder; 
     Object[] data = parentIds.toArray(); 
     try { 
      conn = this.getConnection(); 
      String sql = "SELECT * FROM DEVICE_ORGANIZATION_MAP WHERE DEVICE_PARENT IN (SELECT * FROM TABLE(x VARCHAR = ?))"; 
      stmt = conn.prepareStatement(sql); 
      stmt.setObject(1, data); 
      rs = stmt.executeQuery(); 
      while (rs.next()) { 
       deviceMetadataHolder = this.loadOrganization(rs); 
       children.add(deviceMetadataHolder); 
      } 
     } catch (SQLException e) { 
      throw new DeviceOrganizationDAOException("Error occurred for device list with while retrieving children.", e); 
     } finally { 
      DeviceManagementDAOUtil.cleanupResources(stmt, rs); 
      return children; 
     } 
} 

, 내가 대신 데이터에 대한 개체 배열을 사용하고 기본 쿼리 내부의 추가 쿼리를 추가했습니다. 티에 GitHub 문제의 지침을 따르면 완벽하게 작동했습니다.