Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将本机查询的结果集映射到实体中的变量_Java_Spring_Hibernate_Jpa_Sqlresultsetmapping - Fatal编程技术网

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;