将HQL查询以“从Foo foo,Bar bar where ...中选择foo”的形式转换为Criteria查询

时间:2019-10-04 08:01:07

标签: 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查询转换为“标准”有三点,我不确定该怎么做:

  1. 如何对多个表(from MunicapilityStreet munStreet, Street street部分)进行选择?
  2. 如何使投影只返回两个表中的一个表(select municapilityStreet部分)?
  3. 即使两个表具有相同的列名(and street.id = :streetId部分),如何对一个表的列名具有相等的限制?

1 个答案:

答案 0 :(得分:1)

我反对改写方法,但愿我这样做不是礼貌。

Hibernate允许控制提交(默认情况下,自动提交是关闭的),您正在体验的是Entitymanager-flushes,默认情况下是自动的,可以为disabled too。最后,我认为,如果您运行的是HQL或条件查询,并且位于相同的机器下,也没有什么区别。