gpt4 book ai didi

java - 如何将 native 查询的结果集映射到实体中的变量

转载 作者:行者123 更新时间:2023-11-30 08:06:09 27 4
gpt4 key购买 nike

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

实体:

用户

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

最佳答案

在这种情况下您不能使用 SQLResultSetMapping,因为结果只会映射到不同的实体。您可以做的是作为 native 查询执行,然后以对象数组列表的形式获取结果。然后您可以构造所需的对象。

        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;

关于java - 如何将 native 查询的结果集映射到实体中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080404/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com