2012-02-20 12 views
0

これはかなり簡単かもしれませんが、私はGoogleで数時間を過ごしましたが、関連する回答が見つかりませんでした。異なるwhere句を持つHibernate selectクエリ

私は休止状態に以下のロジックを置くしようとしていますが、私はどのように把握することはできませんよ。 これは私のセットアップです: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 

    } 

を実装したいものです。ただし、OutOfMemory例外が発生する可能性があります。 HQLのあり方をお聞かせください。

これは、あなたがscroll()(またはiterate())メソッドではなく、list()方法を使用して、クエリの結果にスクロールすることができ、私は

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

私は同意する、私は注釈を使用してクラスにテーブルをマップしている。だから今私はT1とT2の2つのクラスを持っている私はHQLに上記のMySQLのクエリを配置する方法。 – girish

+0

HQLクエリはSQLクエリとほとんど同じです。 HQLに関するドキュメントを読んだことがありますか?何を試しましたか? –

答えて

0

何をしたかです。

は確かに定期的にフラッシュ作成し、hibernate documentation of batch updatesで説明したように、セッションをクリア。あなたの擬似SQLクエリは1を持っているよう

また、内側のクエリは、少なくとも、where句を持つ必要があります。 2つのエンティティはおそらくOneToManyまたはOneToOne列に関連付けられている必要があります。これにより、この内部クエリが完全に必要なくなります。

ベストプラクティスは、Hibernateのドキュメントを読むことです。

+0

ありがとう、私は試してみる – girish

0

T1テーブルに反復処理しながら、あなたはこのようなことでwhere句がありますクエリを実行することができます

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