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

标签 hibernate hql

我要字段idEmpresa使用 idDepartamento 成为@Formula 字段(这是另一个@Formula 字段)在 WHERE陈述。

@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: Column name 'idDepartamento' invalid.

最佳答案

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

The formula has to be a valid SQL fragment



所以你不能从你的类中引用任何字段,只能从你的数据库中引用表和列。

但是您可以更改您的 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;
}

我会删除您公式的 setter ,因为它们会混淆您的 API 的任何用户。公式字段通常是只读的。

关于 hibernate :@Formula 查询字段使用另一个 @Formula 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33362921/

相关文章:

hibernate - 存储过程更新数据库后从数据库重新加载对象,而不是缓存?

java - Statement.executeQuery() 和 SQL 注入(inject)

java - hibernate查询的sql等价物是什么

hibernate - 内连接和内连接 fetch 有什么区别? ,HQL

json - 如何使用 Hive (get_json_object) 或 json serde 查询结构数组

Java Hibernate C3P0存储过程命名查询错误-语句关闭后不允许进行操作,无法释放JDBC连接

java - Spring Data Rest 导致 GC 开销超出

nhibernate - 当具有相同术语的 HQL 选择有效时,为什么此 HQL 删除失败?

sql - Hive - 将 Int 转换为 varchar 并连接

hibernate - 计算 Hibernate SQLProjection 中聚合列的排名