繁体   English   中英

如何将本机查询的结果集映射到实体中的变量

[英]How to Map Result Set of Native Query to Variable in Entity

我有两个实体,即“用户”和“注释”,我想将“注释”表上查询的一组结果添加到“用户”实体中的瞬态变量。

实体:

用户

@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表的查询的结果。 这不能简单地是一对多映射,因为我必须以特定方式限制结果。 实际上,查询是这样的:

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实现,但是似乎结果总是映射到另一个不同的实体。 是否可以将集合提取为集合并以我想要的方式存储?

在这种情况下,您不能使用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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM