2012-02-20 5 views
0

Это может быть довольно просто, но я провел часы в Google, но не смог найти ответ.Hibernate select query with different where where

Я пытаюсь ввести нижеследующую логику в спящий режим, но я не могу понять, как это сделать. Это моя настройка: база данных Mysql с двумя таблицами T1 (ID, C1, C2) и T2 (столбец1, столбец2, столбец3). Это то, что я хочу, чтобы реализовать

results = select ID, from T1 //This will result in multiple rows. 

    for(eachRow in results) 
    { 
    select column1,column2,column3 from T2 where ID=eachRow.ID 
    //Do some computation like 
    //Assign value of table "T1" column "C1" to table "T2" column "column1" 
    column1 = eachRow.C1 

    } 

Сейчас я мог думать о логике чтения всей таблицы с помощью Hibernate «из» пункта в список и итерацию через него. Однако это может привести к исключению OutOfMemory. Не могли бы вы предложить, как должен быть HQL?

Это то, что я сделал

Session session = HibernateSession.getSessionFactory().openSession(); 
     Transaction aTableTx = null; 
     try { 
      aTableTx = session.beginTransaction(); 

      _allRows = session.createQuery("from T1").list(); 

      for (Iterator<T1> iterator = _allRows.iterator(); iterator.hasNext();) 
      { 
       T1 aRow = iterator.next(); 
       //Here I am planning to run a similar to 
          //_allRows = session.createQuery("from T2").list(); 
          //Store the result and iterate through the list, but 
          //it is very inefficient. 
      } 

      aTableTx.commit(); 
+0

Прежде всего, HQL не работает на столах, но и на юридических лиц. Покажите нам свои сущности, а не таблицы. –

+0

Согласен, я сопоставил таблицы классу с помощью аннотаций. Итак, теперь у меня есть 2 класса T1 и T2, как я могу поставить вышеупомянутый запрос mysql в HQL. – girish

+0

Запрос HQL будет почти идентичен SQL-запросу. Вы прочитали документацию по HQL? Что вы пробовали? –

ответ

0

Вы можете прокручивать результаты запроса, используя метод scroll() (или iterate()), а не метод list().

Обязательно регулярно очищайте и очищайте сеанс, как описано в hibernate documentation of batch updates.

Кроме того, внутренний запрос должен содержать хотя бы предложение where, так как ваш запрос псевдо-SQL имеет один. Вероятно, эти два объекта должны быть связаны с столбцом OneToMany или OneToOne, что полностью исключает необходимость в этом внутреннем запросе.

Я думаю, что лучше всего было бы прочитать документацию Hibernate.

+0

Спасибо, я попробую – girish

0

Хотя Итерация в таблице T1, вы можете выполнить запрос, который будет иметь где положение в нем, как это:

T1 aRow = iterator.next(); 
Query query= sessionFactory.getCurrentSession().createQuery("from T2 as where T2.ID=:aRowID"); 
query.setInteger("aRowID", aRow.ID);