这可能很简单,但我在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();
答案 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);