mysql - SqlResultSetMapping native SQL 查询和 One2Many 关系

标签 mysql hibernate jpa hql jpql

是否有可能在 SqlResultSetMappingentityManager.createNativeQuery 的帮助下从两个不同的表中获取具有 One2Many 关系的对象?

例如

@Entity
@Table(name = "posts")
public class Post {
    @OneToMany(mappedBy = "post")
    private List<Comment> comments;
}

@Entity
@Table(name = "comments")
public class Comment {
    @ManyToOne(optional = false)
    @JoinColumn(name = "post_id", referencedColumnName = "post_id")
    private Post post;
}

查询:

select p.*, c.* from posts p left join (
    select * from comments where content like "%test%" order by last_edited limit 0, 3) 
as c on p.post_id = c.post_id

基于本地 sql 查询,我需要获取带有评论的帖子对象。

我的意思是 - 因此我需要接收帖子列表,并且此列表中的每个帖子都已经填充了适当的评论。

JPA 可以吗?如果是这样,你能举个例子吗?

最佳答案

我知道这个问题很老,但我仍然找不到答案,因此在这里添加一个。

是的,没有额外的映射是不可能的。结果将是一个对象数组列表。问题是您案例中的评论列表不会自动填写。您需要自己进行映射。

让我们假设您的返回是这样的结果集:

<表类="s-表"> <头> postid postCommentId 发表评论 <正文> 1001 2001 评论内容1 1001 2002 评论内容2 1999 2999 评论内容1 1001 2003 评论内容3 1001 2004 评论内容4

在列表中,您可以看到两个帖子。一个有 4 个评论,一个有 1 个。SqlResultsetMapping 只会将每一行映射为一个对象数组,这意味着不会填充 post.comments 列表。你必须手动完成。 这是您如何做到这一点的示例。

    List<Object[]> resultList = em.createQuery(query).getResultList();
    // prepare a hashmap for easier mapping
    final Map<Long, Post> mappedResult = new HashMap<>(resultList.size());
    resultList.forEach(o -> {
            Post p = (Post) o[0];
            Comment c = (Comment) o[1];
            var processedPost = mappedResult.get(p.getId()); 
            if(processedPost != null) {
                processedPost.addComment(c);
            } else {
                p.addComment(c);
                mappedResult.put(p.getId(), p);
            }
        });
    // return a sorted list from the created hashmap
    return mappedResult.values().stream().sorted((p1, p2) -> p1.getId().compareTo(p2.getId())).toList();

我很确定有更好和更高性能的可能性,但我找不到任何。

关于mysql - SqlResultSetMapping native SQL 查询和 One2Many 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29285033/

相关文章:

java - 使用 SingularAttribute 中的 getName() 函数时出现 NullPointerException

java - 在 hql 中运行查询时出现语法错误

javascript - 为什么 req.body 对我来说总是未定义

mysql - 在 bash 脚本中自动安装 mysql-server 后无法连接到 mysql

spring - 如何从 Spring Boot 中排除依赖项

java - getter getId() 的方法名称冲突

java - Hibernate 验证错误的实体外键

mysql - 使用汉字命名 MySQL 表

mysql - 仅增加集合中一个元素的值

java - 一对多关系 JPA/Hibernate 删除链接