我希望field 在声明中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;
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到:
javax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:列名'idDepartamento'无效.
您似乎正在尝试创建有效的HQL/JPQL语句,但如果您阅读了JavaDoc,Formula您会看到:
该公式必须是有效的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;
}
Run Code Online (Sandbox Code Playgroud)
我会删除公式的setter,因为它们会混淆API的任何用户.公式字段通常是只读的.
| 归档时间: |
|
| 查看次数: |
3369 次 |
| 最近记录: |