Java 如何将本机查询的结果集映射到实体中的变量
我有两个实体,用户和注释,我想将注释表查询的一组结果添加到用户实体中的临时变量中 实体: 使用者Java 如何将本机查询的结果集映射到实体中的变量,java,spring,hibernate,jpa,sqlresultsetmapping,Java,Spring,Hibernate,Jpa,Sqlresultsetmapping,我有两个实体,用户和注释,我想将注释表查询的一组结果添加到用户实体中的临时变量中 实体: 使用者 @Entity public class Users { @Id @GeneratedValue @Column(name="user_id") private Long userId; @Column(name="username", unique=true, nullable=false) private String username;
@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;
.....
因此,我希望Set 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这是可能的,但是,结果似乎总是映射到另一个不同的实体。是否可以将集合提取为集合并以我想要的方式存储?在这种情况下不能使用SqlResultsMapping,因为结果将只映射为不同的实体。您可以做的是作为本机查询执行,然后以对象数组列表的形式获取结果。然后可以构造所需的对象
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;
Query=entityManager
.createNativeQuery(“从注释中选择anno_id、a.user_id作为”
+“左加入组\u成员身份g ON g.user\u id=?”
+“其中a.user_id=?”
+“和(a.access\u control='PUBLIC'”
+“或(a.access\u control='GROUP'和a.GROUP\u id=g.GROUP\u id)”
+“或(a.access\u control='PRIVATE'和g.user\u id=a.user\u id))”
+“a.anno_id集团”);
setParameter(1,新的Long(1));
setParameter(2,新长(1));
List=query.getResultList();
退货清单;
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;