Hibernate:@Formula查询字段使用另一个@Formula字段

时间:2015-10-27 08:23:20

标签: hibernate hql

我希望字段idEmpresaidDepartamento语句中使用WHERE(这是另一个@Formula字段)成为@Formula字段。

@Entity
public class CfgUsuario {

    //More fields
    private String idDepartamento;
    private String idEmpresa;


    @Formula("(SELECT ud.IdDepartamento FROM UsuarioDpto ud WHERE ud.PorDefecto = 'S' AND ud.IdUsuario = idUsuario)")
    public String getIdDepartamento() {
        return idDepartamento;
    }

    public void setIdDepartamento(String idDepartamento) {
        this.idDepartamento = idDepartamento;
    }

    @Formula("(SELECT d.IdEmpresa FROM Departamento d WHERE d.IdDepartamento = idDepartamento)")
    public String getIdEmpresa() {
        return idEmpresa;
    }

    public void setIdEmpresa(String idEmpresa) {
        this.idEmpresa = idEmpresa;
    }

}

但我明白了:

  

javax.persistence.PersistenceException:   org.hibernate.exception.SQLGrammarException:列名'idDepartamento'无效。

1 个答案:

答案 0 :(得分:6)

您似乎正在尝试创建有效的 HQL / JPQL 语句,但如果您阅读Formula的JavaDoc,您会看到:

  

公式必须是有效的 SQL 片段

因此,您无法从类中引用任何字段,只能引用数据库中的表和列。

但您可以将Formula改为使用JOIN代替:

@Formula("(SELECT ud.IdDepartamento FROM UsuarioDpto ud WHERE ud.PorDefecto = 'S' AND ud.IdUsuario = idUsuario)")
public String getIdDepartamento() {
    return idDepartamento;
}

@Formula("(SELECT d.IdEmpresa FROM Departamento d JOIN UsuarioDpto ud ON d.IdDepartamento = uid.idDepartamento WHERE ud.PorDefecto = 'S' AND ud.IdUsuario = idUsuario)")
public String getIdEmpresa() {
    return idEmpresa;
}

我会删除您的公式的 setters ,因为它们会让您的API的任何用户感到困惑。公式字段通常是只读的。