Dmi*_*try 5 java hibernate jpa
很多时候我在我的实体中使用@Formula.但总是这是一个简单的查询或带参数的存储过程,我可以从表中提取.现在我需要从相关对象中使用一些属性.但是当我尝试从DB获取对象时,我看到异常.请看下面的例子
@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
}
Run Code Online (Sandbox Code Playgroud)
我应该如何在@Formula中使用实体道具.我不想写类似的东西
select d.ministry.id from Department d ...
Run Code Online (Sandbox Code Playgroud)
如果您阅读了JavaDoc,Formula您会看到:
该公式必须是有效的SQL片段
所以你必须使用SQL,如:
@Formula("test_package.calc_something("
+ "select DEP.MINISTRY_ID from DEPARTMENT DEP where DEP.ID = DEPARTMENT_ID"
+ ")")
private BigDecimal someMetric;
Run Code Online (Sandbox Code Playgroud)
在将它写入SQL之前,Hibernate在片段中唯一被修改的东西:它会将表别名添加到列中(因为您无法预测).我提到这一点,因为只使用了一个基本的SQL解析器,它会将别名插入错误的位置以获得更复杂的片段.
关于性能的评论:Department即使您只想使用属性进行排序或过滤(只是从属性的名称猜测),也会为您加载的每个实体执行公式- 除非您使用 @Basic(fetch = FetchType.LAZY)并打开字节码检测(或者用...模仿FieldHandled.
| 归档时间: |
|
| 查看次数: |
4677 次 |
| 最近记录: |