Hibernate使用不同的where子句选择查询

时间:2012-02-20 16:26:47

标签: hibernate hql

这可能很简单,但我在Google上花了好几个小时但找不到相关的答案。

我试图将下面的逻辑放入休眠状态,但我无法弄清楚如何。 这是我的设置:具有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“from”子句将整个表读入List并迭代它。但是,这可能会导致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();

2 个答案:

答案 0 :(得分:0)

您可以使用scroll()(或iterate())方法而不是list()方法滚动查询结果。

确保定期刷新并清除会话,如hibernate documentation of batch updates中所述。

此外,内部查询至少应该有一个where子句,因为你的伪SQL查询有一个。这两个实体应该与OneToMany或OneToOne列相关联,这样就可以完全避免使用这个内部查询。

我认为最好的办法是阅读Hibernate文档。

答案 1 :(得分:0)

在T1表中进行迭代时,您可以运行一个查询,其中包含where子句,如下所示:

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