【问题标题】:Hibernate: @Formula query field using another @Formula fieldHibernate:使用另一个@Formula 字段的@Formula 查询字段
【发布时间】:2016-01-26 13:35:05
【问题描述】:

我希望字段idEmpresa 成为@Formula 字段,在WHERE 语句中使用idDepartamento(即另一个@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”无效。

【问题讨论】:

    标签: hibernate hql


    【解决方案1】:

    您似乎正在尝试创建一个有效的 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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 2015-03-25
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      相关资源
      最近更新 更多