我正在创建一个小型论坛。实体及其关系是这样的:
实体Topic
与OneToMany
的关联Post
,Post
与ManyToOne
的关联User
我想通过查看每个主题中第一篇文章的作者来获取一个特定用户的所有主题。这是我的JPQL:
SELECT t FROM Topic t JOIN t.posts p WHERE p.user=:user
但是这个WHERE会检查主题中的所有帖子,我只想查看第一篇帖子(此用户将被视为该主题的作者)。
由于
答案 0 :(得分:1)
我在这里找到了更好的解决方案:Indexed element access in JPQL
基本上我可以在JPQL中使用INDEX()
来描述集合的索引:
SELECT t FROM Topic t JOIN t.posts p WHERE p.user = :user AND INDEX(p) = 0
为了使INDEX()
有效,我需要在@OrderedColumn
实体的Topic
字段上添加posts
:
@OrderColumn(name = "order_column")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "topic")
private List<Post> posts = new ArrayList<>();
问题是,Hibernate中存在一个错误,它不支持@OrderedColumn
和mappedBy
:
JPA 2.0 @OrderColumn annotation in Hibernate 3.5
作为解决方案,我在实体Post
中手动更新订单栏:
@Column(name = "order_column")
private Integer orderColumn;
@PrePersist
@PreUpdate
private void updateOrderColumn() {
// for changing order
orderColumn = topic.getPosts().indexOf(this);
// for persist
if (orderColumn == -1)
orderColumn = topic.getPosts().size();
}
答案 1 :(得分:0)
只需使用本机查询,在连接时选择子选项,以便
@Query(value = "SELECT * FROM topics t JOIN posts p ON p.topic_id = (SELECT topic_id FROM posts p1 WHERE p1.topic_id = t.id ORDER BY p1.id ASC LIMIT 1) WHERE p.user_id = :userId", nativeQuery=true)
List<Topic> findTopicsByUser(@Param("userId") Long userId);