JPA查询抽象类+子类字段条件

Lud*_*ume 6 inheritance jpa abstract

我有一个像这样的持久性模型:

@Entity
public abstract class Employee {
    @Id
    protected Integer employeeId;
    ...
}
@Entity
public class FullTimeEmployee extends Employee {
    protected Integer salary;
    ...
}
@Entity
public class PartTimeEmployee extends Employee {
    protected Float hourlyWage;
}
Run Code Online (Sandbox Code Playgroud)

我想查询具有某些子类条件的Employees,例如:salary> 1000.

我尝试了这个,但没有工作.

SELECT e
FROM Employee e
WHERE e.salary > 1000;

SELECT e
FROM Employee e
WHERE (TYPE(e) = FullTimeEmployee AND e.salary > 1000)
OR TYPE(e) = PartTimeEmployee;
Run Code Online (Sandbox Code Playgroud)

我还尝试在Employee中放置一个抽象方法,并在查询中使用它,但也不工作.

请问你能帮帮我吗 ?

谢谢,

Lud*_*ume 9

好的,我找到了解决方案.我不认为它是最好的,因为最终本机查询中的多次连接.但它正在发挥作用.

SELECT e
FROM Employee e, FullTimeEmployee f, PartTimeEmployee p
WHERE (e = f AND f.salary > 1000)
OR (e = p ...);
Run Code Online (Sandbox Code Playgroud)

编辑:

发现了另一个解决方案是一种LOT比200K行上方的一个更快.在where子句中使用嵌套选择:

SELECT e
FROM Employee e
WHERE e.employeeId IN (SELECT f.employeeId FROM FullTimeEmployee f WHERE f.salary > 1000)
OR e.employeeId IN (SELECT p.employeeId FROM PartTimeEmployee p WHERE ...)
Run Code Online (Sandbox Code Playgroud)

EDIT²:

似乎我不需要再加入最后一个版本的Hibernate(目前是4.3.10.Final).

SELECT e
FROM Employee e
WHERE e.salary IS NULL
OR e.salary > 1000
Run Code Online (Sandbox Code Playgroud)

应该管用