【问题标题】:Hibernate select query with different where clause具有不同 where 子句的休眠选择查询
【发布时间】:2012-02-20 16:26:46
【问题描述】:

这可能很简单,但我在 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”子句将整个表读取到一个列表中并遍历它。但是,这可能会导致 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();

【问题讨论】:

  • 首先,HQL 不适用于表,但适用于实体。向我们展示您的实体而不是表格。
  • 我同意,我已使用注释将表映射到类。所以现在我有 2 个类 T1 和 T2 我如何将上面的 mysql 查询放入 HQL。
  • HQL 查询与 SQL 查询几乎相同。您是否阅读过有关 HQL 的文档?你试过什么?
  • 我已经编辑并添加了我的代码。

标签: hibernate hql


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2014-08-13
      • 2014-12-01
      • 2014-09-29
      • 2018-12-04
      • 2017-02-13
      • 1970-01-01
      相关资源
      最近更新 更多