在我们的(古老的)项目中,我们在 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 有三点我不确定该怎么做:
- 如何对多个表进行选择(
来自 MunicapilityStreet munStreet、Street street
部分)? - 如何进行投影以仅返回两个表中的一个表(
select municapilityStreet
部分)? - 即使两个表具有相同的列名(
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/