2015-10-23 2 views
0

Скажем, у меня есть эта nativeQuery в моей DAO:Как избежать выполнения запроса несколько раз?

SELECT a, b, c FROM table 

, который возвращает все значения, мне нужно.

Проблема в том, что у меня слишком много результатов, и Мне нужен запрос для запуска только один раз вместо запуска для каждой найденной строки.

Я получение результата запроса и установки всех значений в классе (объект значений) называется Class так:

public List<Class> listClass() { 

    List<Class> listaObjs; 

    String nativeQuery = "SELECT a, b, c FROM table"; 
    SQLQuery q = getSession().createSQLQuery(nativeQuery); 

    int totalRecords = q.list().size(); 
    System.out.println("Total records: " + totalRecords); 

    listaObjs = q.list(); 

    // For every ROW in query Result 
    for (int i = 0; i < totalRecords; i++) { 
     Object[] objs = (Object[]) q.list().get(i); 
     Class item = new Class(); 

     // For every COLUMN in that ROW 
     for (Object obj : objs) { 
      item.setValueA((String) objs[0]); 
      item.setValueB(((String) objs[1])); 
      item.setValueC(((String) objs[2])); 
      listaObjs.add(item); 
     } 
    } 
    return listaObjs; 
} 

Я буду немного застрял здесь, потому что я никогда не рассматривал этот Object[] до Class литье перед.

+1

«Класс» не является «объектом []». –

+0

Хорошо, я могу это исправить. Но моя проблема в том, что этот запрос повторяется. Любые намеки? – Marcelo

+0

Конечно, он повторяется, он вызывается в цикле. –

ответ

2

Изменение ниже линии

// For every ROW in query Result 
for (int i = 0; i < totalRecords; i++) { 
    Object[] objs = (Object[]) q.list().get(i); 

List<Object[]> objArr = q.list(); 
// For every ROW in query Result 
for (int i = 0; i < totalRecords; i++) { 
    Object[] objs = (Object[]) objArr.get(i); 
+0

Это сделало трюк, спасибо. – Marcelo

0

Вы должны позвонить по телефону q.list() вне цикла. Затем вы должны перебирать возвращаемый ResultSet, который должен быть вашим циклом. Прочитайте, как правильно перебирать через ResultSet (или, может быть, через List, возвращаемый API, который вы используете).

1

Этот код будет повторно запустить запрос на каждой итерации:

Object[] objs = (Object[]) q.list().get(i); 

Вы получили список уже с listaObjs = q.list();, поэтому работа на listaObjs внутри цикла:

for (int i = 0; i < totalRecords; i++) { 
     Object[] objs = (Object[])listaObjs.get(i); 
2

У вашего кода много проблем с производительностью и программным обеспечением. Пожалуйста, попробуйте ниже.

public List<Class> listClass() { 

     List<Class> listaObjs = new ArrayList<Class>(); 

     String nativeQuery = "SELECT a, b, c FROM table"; 
     SQLQuery q = getSession().createSQLQuery(nativeQuery); 

     List<Object[]> totalRecords = q.list(); 
     System.out.println("Total records: " + totalRecords.size()); 


     for (Object[] objects : totalRecords) { 
      Class item = new Class(); 
      item.setValueA((String) objs[0]); 
      item.setValueB(((String) objs[1])); 
      item.setValueC(((String) objs[2])); 
      listaObjs.add(item); 
     } 

     return listaObjs; 
    } 
+0

Я исправил ... –

0

Не вызывайте q.list каждый раз, только один раз и сохраняйте результат в переменной List. (Q.list() выполняет SQL, но вам не нужно его каждый раз)

List resultList = q.list(); 
int totalRecords = resultList.size(); 

и так далее ...

Вы можете рассмотреть возможность использования итерации вместо цикл, может быть SQLQuery имеет итерационный метод, если нет, iteratr над списком.

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

  • Нет связанных вопросов^_^