1

ユーザーと注釈の 2 つのエンティティがあり、注釈テーブルのクエリからの一連の結果をユーザー エンティティの一時変数に追加したいと考えています。

エンティティ:

ユーザー

@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、Annotations テーブルに対するクエリの結果を変数に保持する必要があります。特定の方法で結果を制限する必要があるため、これは単純な 1 対多のマッピングではありません。実際、クエリは次のとおりです。

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 を介して可能だと思いますが、結果は常に別の異なるエンティティにマップされているようです。セットをコレクションとして抽出し、希望する方法で保存することはできますか?

4

1 に答える 1