从SQL到HQL的Hibernate - 无限循环?

时间:2016-01-13 16:16:33

标签: hibernate

我试图将我的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个值...

1 个答案:

答案 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);