在我们的(古老的)项目中,我们在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查询转换为“标准”有三点,我不确定该怎么做:
from MunicapilityStreet munStreet, Street street
部分)进行选择?select municapilityStreet
部分)?and street.id = :streetId
部分),如何对一个表的列名具有相等的限制?答案 0 :(得分:1)
我反对改写方法,但愿我这样做不是礼貌。
Hibernate允许控制提交(默认情况下,自动提交是关闭的),您正在体验的是Entitymanager-flushes,默认情况下是自动的,可以为disabled too。最后,我认为,如果您运行的是HQL或条件查询,并且位于相同的机器下,也没有什么区别。