7

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

@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;
}

我想查询具有某些子类条件的员工,例如:薪水> 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;

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

请问你能帮帮我吗 ?

谢谢,

4

1 回答 1

12

好的,我找到了解决方案。我认为这不是最好的,因为最终本机查询中有多个联接。但它正在工作。

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

编辑:

找到了另一种解决方案,它比上面的具有 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 ...)

编辑²:

看来我不需要再加入最新版本的 Hibernate(当前为 4.3.10.Final)。

SELECT e
FROM Employee e
WHERE e.salary IS NULL
OR e.salary > 1000

应该管用

于 2013-08-05T08:21:47.927 回答