gpt4 book ai didi

java - 如何在 Hibernate @Formula 中使用实体字段

转载 作者:搜寻专家 更新时间:2023-10-31 19:54:04 28 4
gpt4 key购买 nike

很多时候我在我的实体中使用@Formula。但它始终是一个简单的查询或带有参数的存储过程,我可以从表中获取这些参数。现在我需要使用相关对象的一些属性。但是我在尝试从数据库中获取对象时看到异常。请看下面的例子

@Entity
@Table(name = "MINISTRY")
public class Ministry {

@Id
@Column(name = "ID")
private Long id;

@Column(name = "NAME")
private String name;

// unnecessary code

}

@Entity
@Table(name = "DEPARTMENT")
public class Department {

@Id
@Column(name = "ID")
private Long id;

@Column(name = "DEP_NAME")
private String departmentName;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MINISTRY_ID")
private Ministry ministry;

// unnecessary code
}

@Entity
@Table(name = "EMPLOYEE")
public class Employee {

@Id
@Column(name = "ID")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DEPARTMENT_ID")
private Department department;

@Formula("test_package.calc_something(department.ministry.id)")
private BigDecimal someMetric;

// unnecessary code

}

我应该如何在@Formula 中使用实体 Prop 。 我不想写类似

的东西
select d.ministry.id from Department d ...

最佳答案

如果您阅读 Formula 的 JavaDoc你会看到:

The formula has to be a valid SQL fragment

所以你必须像这样使用 SQL:

 @Formula("test_package.calc_something("
+ "select DEP.MINISTRY_ID from DEPARTMENT DEP where DEP.ID = DEPARTMENT_ID"
+ ")")
private BigDecimal someMetric;

在将片段写入 SQL 之前,Hibernate 在片段中唯一修改的是:它将表别名添加到您的列(因为您无法预测)。我提到了这一点,因为只使用了一个基本的 SQL 解析器,对于更复杂的片段,它将在错误的位置插入别名。

关于性能的评论:公式针对每个 Department 执行你加载的实体,即使你只想使用属性进行排序或过滤(只是从属性的名称猜测) - 除非你使用 @Basic(fetch = FetchType.LAZY)并打开字节码检测(或使用 FieldHandled 模拟)。

关于java - 如何在 Hibernate @Formula 中使用实体字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32206994/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com