gpt4 book ai didi

mysql - SqlResultSetMapping native SQL 查询和 One2Many 关系

转载 作者:行者123 更新时间:2023-11-29 03:32:06 26 4
gpt4 key购买 nike

是否有可能在 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-表"><头>postidpostCommentId发表评论<正文>10012001评论内容110012002评论内容219992999评论内容110012003评论内容310012004评论内容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/

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