java - 将 "select foo from Foo foo, Bar bar where ..."形式的HQL查询转换为Criteria查询

标签 java hibernate select hql hibernate-criteria

在我们的(古老的)项目中,我们在 Hibernate 版本 3.5.6-Final 上使用大量带有 HQL 的选择查询。因为 Hibernate 会执行自动提交,因为它不知道它们是选择查询,所以我正在将所有 HQL 选择查询重写为 Hibernate Criteria 查询,这样当我们不这样做时,它就不会执行中间提交还不想要它。在大多数情况下,这非常简单,但我目前正在查看这样的查询,并且我不知道如何转换它:

Query query = session.createQuery("select municapilityStreet"
  + " from MunicapilityStreet munStreet, Street street"
  + " where munStreet.id = street.MunicapilityStreet.id"
  + " and street.id = :streetId");
query.setParameter(":streetId", streetId);
MunicapilityStreet result = (MunicapilityStreet) query.uniqueResult();
return result;

到目前为止,我正在对其进行改造:

Criteria criteria = session.createCriteria(MunicapilityStreet.class);

// No idea what to set here to only get the "municapilityStreet" as result
criteria.setProjection(??);

// I'm not sure if this is correct. With a criteria on a single table it would have been simply "Id".
// Both tables have the column-name Id, and I'm not sure how to differentiate between them.
criteria.add(Restrictions.eq("Street.Id", streetId));

MunicapilityStreet result = (MunicapilityStreet) criteria.uniqueResult();
return result;

也许我应该为每个问题创建一个不同的问题,但是将上述 HQL 查询转换为 Criteria 有三点我不确定该怎么做:

  1. 如何对多个表进行选择(来自 MunicapilityStreet munStreet、Street street 部分)?
  2. 如何进行投影以仅返回两个表中的一个表(select municapilityStreet 部分)?
  3. 即使两个表具有相同的列名(and street.id = :streetId 部分),如何对一个表的列名进行 equal-Restriction?

最佳答案

我确实反对重写方法,希望这样做没有失礼。

Hibernate 允许控制提交(自动提交默认关闭),您遇到的是 Entitymanager-flushes,它们默认是自动的,可以是 disabled too 。最后,我认为,如果您运行 HQL 或条件查询,那么底层的机制是相同的,没有什么区别。

关于java - 将 "select foo from Foo foo, Bar bar where ..."形式的HQL查询转换为Criteria查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58232215/

相关文章:

java - 如何才能实现对某个主题的消息只处理一次?

java - 在序列化期间从实体中删除代理代码

java - RunTimeException 是什么原因?

sql-server - VARCHAR 列上的 WHERE 子句似乎作为 LIKE 操作

java - 如何将字符串传递给另一个类中的另一个字符串变量?

Java watcher - 如何知道文件是否已完全创建

java - 为什么不能将 Scala 对象分配给 Java 变量?

java - 简单的 hibernate 查询不可滚动

mysql - 从 MySQL 中智能选择

MySQL选择第一个字符在哪里