2016-01-13 63 views
1

我试图将我的Sql查询转换为HQL,因为它们更容易在视图和控制器中进行管理。从SQL到HQL的Hibernate - 无限循环?

所以我有2个实体,Luce和Illuminazione。 ILLUMINAZIONE与卢斯一个多对一的注释,这样

@ManyToOne 
    @JoinColumn(name = "id_luce") 
    public Luce getLuce() { 
     return this.luce; 
    } 

    public void setLuce(Luce luce) { 
     this.luce = luce; 
    } 

现在,我有ILLUMINAZIONE元素的列表,我需要用最大的日期,卢斯元素分组抢的。换句话说,我只需要从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

如果SQL正在工作,只保留它。休眠不是一种宗教,你不会绕过这个抽象层去下地狱。

使用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); 
+0

用'addEntity'我可以用Illuminazione.class命名?这个问题真的是在视图中使用列名,而不是Java对象的属性......顺便说一句,为了知识的缘故,HQL查询花费很长时间来完成相同的SQL查询可能性如何? – besmart

+0

addEntity将从i。*字段执行自动映射。该查询将返回Illuminazione对象。如果你不需要这个,你可以使用addScalar来获取所需的属性。较少的抽象通常是更多的表现。 Hiberate执行HQL编译并为每一行执行映射。 – Orden