我试图将我的Sql查询转换为HQL,因为它们更容易在视图和控制器中进行管理。
所以我有2个实体,Luce和Illuminazione。 Illuminazione以这种方式与Luce一起使用ManyToOne注释
@ManyToOne
@JoinColumn(name = "id_luce")
public Luce getLuce() {
return this.luce;
}
public void setLuce(Luce luce) {
this.luce = luce;
}
现在,我有一个Illuminazione元素列表,我需要抓住具有最大日期的元素,按Luce元素分组。换句话说,我只需要从Illuminazione实体中获取每个Luce对象的最后一个状态。
有效的SQL查询是
String query = "select i.id_evento, i.id_luce, i.last_date_time, l.numero_luce, l.nome_luce, ill.MaxDate, i.isLit "
+ "from illuminazione i inner join luci l on i.id_luce= l.id_luce "
+ "inner join (SELECT `id_luce` as numeroLuce2, max(date_time) as MaxDate from illuminazione i2 group by `i2`.`id_luce`) ill "
+ "on i.id_luce = ill.`numeroLuce2` and i.`date_time` = ill.MaxDate order by i.`id_luce` asc";
SQLQuery q = getSession().createSQLQuery(query);
q.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
我已经尝试过这个HQL查询,但我在无限循环中结束了...所以我觉得有些奇怪......
String query = "select i from Illuminazione i where i.dateTime = (select max(ii.dateTime) from Illuminazione ii where i.luce = "
+ "ii.luce)";
有没有办法达到我的需要?
修改 实际上它并没有进入无限循环,但是在6-7分钟之后它就完成了,结果是正确的,但是这么长时间它是如何可能的呢?表中只有2000个值...
答案 0 :(得分:0)
如果SQL正在运行,请保留它。 Hibernate不是一种宗教信仰,你不会因为绕过这个抽象层而下地狱。
使用SQL客户端进行调试也会更容易。
唯一的缺点是,如果您必须支持多种数据库类型。
为了简化操作,您可以执行
String query = "select {i.*} "
+ "from illuminazione i inner join luci l on i.id_luce= l.id_luce "
+ "inner join (SELECT `id_luce` as numeroLuce2, max(date_time) as MaxDate from illuminazione i2 group by `i2`.`id_luce`) ill "
+ "on i.id_luce = ill.`numeroLuce2` and i.`date_time` = ill.MaxDate order by i.`id_luce` asc";
SQLQuery q = getSession().createSQLQuery(query)
.addEntity("i", Illuminazione.class);