2013-10-23 68 views
2

我有這樣一個建模項目:Criteria多態如何在JPA中加入?

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 = ? 
+1

你有沒有經歷過這個問題http://stackoverflow.com/questions/17212905/polymorphic-jpa-query-with-criteriaquery-api。 – Ashish

回答

0

我解決了在Actor和Role之間建立雙向關係的問題clas S:

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<role>

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

起初,我想避免的雙向關係,但我意識到,在這種特殊情況下,也有直接好處