2014-11-27 1 views
0

두 가지 방법으로 SQL 결과 집합을 전달하고 싶습니다. 문제는 (rs.next)가 별도로 작동하는 동안 두 가지 방법으로 실행됩니다. 그런 다음 한 메소드가 실행 된 후 다른 메소드가 0 개의 결과 세트를 얻습니다. 어떻게 결과를 두 가지 방법으로 전달할 수 있습니까?두 가지 방법으로 SQL 결과 집합을 전달하는 방법?

public void demo(){ 
    /* Result set got from the corpusSentenceRetrive method */ 
    ResultSet rsNew=corpusSentenceRetrive(wordAll); 
    method1(rsNew); 
    method2(rsNew); 
    } 

    public void method1(ResultSet rst){ 
    ResultSet rs = rst; 

    while (rs.next()) {....} 
    } 
    public void method2(ResultSet rst){ 
    ResultSet rs = rst; 

    while (rs.next()) {....} 
    } 

다른 방법을 실행 한 방법이 0 결과 집합을 수신 할 때. 둘 다 실행하고 싶습니다. 어떻게 해결할 수 있습니까?

나는 2 개의 위치 결과 집합을 배열 결과 목록에 저장하고 그 결과를 사용하려고했습니다. 그러나 그것은 또한 문제를 해결하지 못했습니다.

+0

'method2'를 호출하기 전에 모든 요소에 대해'method1'을 실행하는 것이 중요합니까? 메소드가 수행하는 것에 대해 정밀도를 부여하십시오. – Dici

+0

@Dici Yep. 두 가지 작업을 분리하여 두 가지 방법을 수행하십시오. 결과 집합 데이터가 두 가지 다른 방식으로 실행되기 때문입니다. 한 가지 방법으로 구현할 수 없습니다. – Maduri

답변

0

그렇지만 이것은 매우 비효율적입니다. 데이터베이스/드라이버가 스크롤 가능한 결과 집합을 지원하면 두 가지 방법으로 결과 집합을 되감기 할 수 있습니다. 그러나 말했다 : 이것은 쓰레기 해결책이다.

3

ResultSet의 데이터를 하나의 방법으로 소비하고 List<Whatever> whateverList을 반환 한 다음 실제 데이터가있는이 메서드를 whateverList으로 사용합니다.

Statement 또는 PreparedStatement을 만들 때 다른 방법으로 ResultSet.TYPE_SCROLL_SENSITIVE을 사용하고 첫 번째 방법을 호출 한 후 두 번째 방법을 호출하기 전에 첫 번째 줄로 이동하십시오.

IMO 나는 후자가 아닌 전자를 사용합니다.

+0

조금 더 설명 할 수 있습니까? 네가 언급 한 정확한 생각을 못 들었어? – Maduri

+1

@Maduri 여러분은 클래스를 만들고, Yourclass'라고 가정하고,'List yourClassList'를 호출하고,'yourClassList'리스트를 채우기 위해'ResultSet'에서 데이터를 읽습니다. 마지막으로'yourClassList'를 메소드에 매개 변수로 전달합니다. . 코드는 * Altern * 단락 앞에 [dasblinkenlight의 대답] (http://stackoverflow.com/a/27174828/1065197)에 설명되어 있습니다. –

3

여러 가지 방법으로 원시 결과 집합을 전달하지 마십시오. 결과 세트에서 데이터를 읽고,이를 Java 오브젝트 콜렉션에 넣은 다음 원하는만큼 콜렉션을 전달하는 하나의 메소드를 작성하십시오.

class DataObject { 
    public DataObject(int id, String name, String ...) { 
     ... 
    } 
    public int getId() {...} 
} 


List<DataObject> readAll() { 
    ... // Read the data and put it in the list 
} 
... 
List<DataObject> data = readAll(); 
method1(data); 
method2(data); 

다른 방법으로는 오히려 전체 결과 집합보다는, 하나의 행에서 작동하도록 method1method2를 다시 작성할 수 있습니다. 그리고 독자 방법은 루프를 처리하고, 데이터베이스에서 반환 된 각 행에 대해 method1method2를 호출 할 수 있습니다

while (rs.next()) { 
    singleRowMethod1(rs); 
    singleRowMethod2(rs); 
} 
+0

그 데이터를 모두 저장하지 않으려면 어떻게해야합니까? 그가하고있는 치료의 종류에 따라 루프 내에서 직접 수행하는 것이 더 좋을 수도 있습니다 – Dici

+0

@Dici 아마도 OP는 1이 아닌 2 개의 쿼리를 사용해야합니다. –

+0

@Dici 모든 데이터를 저장하고 싶지 않다면 서버에서 처리하고 값 비싼 데이터 전송을 피하는 것이 가장 좋습니다. – dasblinkenlight

0

우리는 ResultSet의 API를 사용하여 첫 번째 행 이전에 결과 집합 커서를 이동 할 수 있습니다.

Statement stmt = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
    ResultSet.CONCUR_READ_ONLY); 
ResultSet resultSet = stmt.executeQuery("SELECT * FROM my_table"); 
// Move cursor forward as you normally traverse through ResultSet 
while (resultSet.next()) { 
    // Get data at cursor 
    String s = resultSet.getString(1); 
} 
// move cursor before first row 
resultSet.beforeFirst();` 

이 resultSet을 모든 메서드에 전달하고 루프에서 평소와 같이 반복합니다.

관련 문제