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

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)

Tob*_*fke 6

如果您阅读了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.