2012-02-20 100 views
0

這可能很簡單,但我花了數小時在谷歌,但無法找到相關答案。休眠選擇查詢與不同的where子句

我想把下面的邏輯放入休眠狀態,但我無法弄清楚如何。 這是我的設置:具有2個表T1(ID,C1,C2)和T2(column1,column2,column3)的Mysql數據庫。 這是我想要實現

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不能在表工作,但對實體。向我們展示你的實體而不是表格。 – 2012-02-20 18:09:18

+0

我同意,我使用註釋將表映射到類。所以現在我有2個類T1和T2我如何把上面的mysql查詢放入HQL中。 – girish 2012-02-20 18:21:15

+0

HQL查詢將與SQL查詢幾乎相同。您是否閱讀過關於HQL的文檔?你有什麼嘗試? – 2012-02-20 18:23:51

回答

0

您可以滾動到查詢的結果,使用scroll()(或iterate())方法,而不是list()方法。

請確保定期刷新並清除會話,如hibernate documentation of batch updates中所述。

此外,內部查詢應至少有一個where子句,因爲您的僞SQL查詢有一個。這兩個實體可能應該與OneToMany或OneToOne列關聯,這將避免完全需要這個內部查詢。

我認爲最好的辦法是閱讀Hibernate文檔。

+0

謝謝,我會試一試 – girish 2012-02-20 18:49:50

0

在迭代在T1表,你可以運行一個查詢,將有一個像這樣在其中的where子句:

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