【问题标题】:How do a Criteria polymorphic join in JPA?如何在 JPA 中加入 Criteria 多态?
【发布时间】:2013-10-23 16:13:18
【问题描述】:

我有一个项目有这样的建模:

public abstract class Actor{}
public class Person extends Actor {}
public class Organization extends Actor {}

public abstract class Role{ @ManyToOne @JoinColumn(name="ID_ACTOR") }
public class Customer extends Role{}
public class Employee extends Role{}

我想要一个List<Role>,它扮演一个特定的演员:

public List<Role> getRoles(Actor actor) {
  CriteriaBuilder builder = em.getCriteriaBuilder();
  CriteriaQuery<Role> criteria = builder.createQuery(Role.class);

  //How to do this filter using Criteria API (JPA 2.1)?

  return query.getResultList();
}

下面的 SQL 完成了这项工作:

SELECT 'Customer' as role, c.id as id, c.id_actor as actor
FROM customer c
left join person p on p.id = c.id_actor
left join organization o on o.id = c.id_actor
where c.id_actor = ?

UNION 

SELECT 'Employee' as role, e.id as id, e.id_actor as actor
FROM employee e
left join person p on p.id = e.id_actor
left join organization o on o.id = e.id_actor
where e.id_actor = ?

【问题讨论】:

标签: jpa jpa-2.0 criteria-api


【解决方案1】:

我解决了在 Actor 和 Role 类之间建立双向关系的问题:

public abstract class Actor{ @OneToMany(mappedBy="actor") List<Role> roles }
public class Person extends Actor {}
public class Organization extends Actor {}

public abstract class Role{ @ManyToOne @JoinColumn(name="ID_ACTOR") Actor actor }
public class Customer extends Role{}
public class Employee extends Role{}

这样我就可以获得扮演特定演员的List&lt;role&gt;

public List<Role> getRoles(Actor actor) {
    return actor.getRoles();
}

最初我想避免双向关系,但我意识到在这种特殊情况下,有直接的好处

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 2014-05-04
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多