【问题标题】:JPA query on abstract class + subclass field condition抽象类+子类字段条件的JPA查询
【发布时间】:2013-08-05 07:51:01
【问题描述】:

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

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

我想查询一些子类条件的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;

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

你能帮帮我吗?

谢谢,

【问题讨论】:

    标签: inheritance jpa abstract


    【解决方案1】:

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

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

    编辑:

    找到了另一种解决方案,它比上面 200k 行的解决方案快 LOT。在 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
    

    应该有效

    【讨论】:

    • 很好的解决方案。第二个在我的情况下特别有用,我已经编写了两个单独的查询,但必须将它们放在一起。
    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    相关资源
    最近更新 更多