2014-11-27 2 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 результирующий набор. Я хочу выполнить оба. Как я могу решить?

Я попробовал список массива результатов набора результатов два места и использовал два набора результатов. Но это также не решило проблему.

+0

Важно ли, чтобы 'method1' выполнялся на всех элементах перед вызовом' method2'? Дайте некоторую точность о том, что делают методы – Dici

+0

@ Dici Yep. Отделите две работы, сделав два метода. Поскольку данные набора результатов выполняются двумя разными. не удалось реализовать одним способом. – Maduri

ответ

0

Да, это выполнимо, однако очень неэффективно. Если ваша база данных/драйвер поддерживает прокручиваемые результирующие объекты, вы можете перемотать результирующий набор между двумя методами. Но, как сказано: это дерьмовое решение.

3

Используйте данные в ResultSet в одном методе и верните List<Whatever> whateverList, а затем используйте whateverList в своих методах с реальными данными.

Другой подход может использоваться при создании Statement или PreparedStatement и перейти к первой строке после вызова 1-го метода и до вызова второго метода.

IMO Я бы использовал бывший, а не последний.

+0

Не могли бы вы немного объяснить? Я не мог понять, что вы упомянули? – Maduri

+1

@Maduri вы создаете класс, скажем 'Yourclass', затем' List yourClassList' и читаете данные из 'ResultSet', чтобы заполнить список' yourClassList', как последний шаг, который вы передаете 'yourClassList' в качестве параметра для ваших методов , Код описан в [ответе 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); 

В качестве альтернативы, можно переписать method1 и method2 работать на одной строке, а не на всем наборе результатов. Тогда метод читатель мог иметь дело с петлей, и вызвать method1 и method2 для каждой строки, возвращаемой из базы данных:

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

Что делать, если он не хочет хранить все эти данные? В зависимости от вида лечения, которое он делает, лучше было бы сделать это непосредственно в цикле – Dici

+0

@ Dici, вероятно, OP должен использовать два запроса, а не 1. –

+0

@ Dici Если вы не хотите хранить все данные, лучше всего выполнять обработку на сервере и избегать дорогостоящей передачи данных. – dasblinkenlight

0

Мы можем переместить Resultset курсор перед первой строкой, используя 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();` 

Передача этого результатаНастройте любой метод и повторите процедуру как обычно в циклах.

Смежные вопросы