2015-06-26 66 views
1

我有兩個實體Users和Annotations,我想將Annotations表上的查詢結果集添加到Users實體中的瞬態變量中。如何將實體查詢的結果集映射到實體中的變量

實體:

用戶

@Entity 
public class Users { 
    @Id 
    @GeneratedValue 
    @Column(name="user_id") 
    private Long userId; 

    @Column(name="username", unique=true, nullable=false) 
    private String username; 

    @Transient 
    private Set<Annotation> annotations; 
    ..... 

批註

@Entity 
@Table(name="Annotation") 
public class Annotation { 

    @Id 
    @GeneratedValue 
    @Column(name="anno_id") 
    private Long annoId; 

    @Column(name="user_id", nullable=false) 
    private Long userId; 

    @Enumerated(EnumType.STRING) 
    @Column(name="access_control", nullable=false) 
    private Access accessControl; 

    @Column(name="group_id", nullable=true) 
    private Long groupId; 
    ..... 

所以我希望Set<Annotation> annotations變量從註解表的查詢結果舉行。這不能簡單地是一對多的映射,因爲我必須以特定的方式限制結果。事實上,查詢是這樣的:

SELECT anno_id, a.user_id, timestamp, is_redacted, access_control, a.group_id, vocabulary_id, key_, value, target_type, target_id, root_type, root_id FROM Annotation AS a 
LEFT JOIN group_membership g ON g.user_id = ?#{ principal?.getId() } 
WHERE a.user_id = :id 
AND (a.access_control='PUBLIC' 
OR (a.access_control='GROUP' AND a.group_id = g.group_id 
OR (a.access_control='PRIVATE' AND g.user_id = a.user_id)) 
GROUP BY a.anno_id 

我認爲這是可能通過SQLResultSetMapping,但是,它好像結果總是映射到另一個獨立的實體。是否有可能將集合提取爲集合並將其存儲爲我想要的方式?

回答

1

在這種情況下,您不能使用SQLResultSetMapping,因爲結果只會被映射爲不同的實體。你可以做的是作爲本地查詢執行,然後將結果作爲對象數組的列表。然後,您可以構建所需的所需對象。

 Query query = entityManager 
       .createNativeQuery("SELECT anno_id, a.user_id FROM Annotation AS a" 
         + " LEFT JOIN group_membership g ON g.user_id = ?" 
         + " WHERE a.user_id = ?" 
         + " AND (a.access_control='PUBLIC'" 
         + " OR (a.access_control='GROUP' AND a.group_id = g.group_id)" 
         + " OR (a.access_control='PRIVATE' AND g.user_id = a.user_id))" 
         + " GROUP BY a.anno_id"); 
     query.setParameter(1, new Long(1)); 
     query.setParameter(2, new Long(1)); 
     List<Object[]> list = query.getResultList(); 
     return list; 
相關問題