WHERE中的JPQL单个集合元素



我正在创建一个小型论坛。实体及其关系如下:

实体TopicPost具有OneToMany关系,PostUser 具有ManyToOne关系

我想通过检查每个主题中第一篇文章的作者来获得一个特定用户的所有主题。这是我的JPQL:

SELECT t FROM Topic t JOIN t.posts p WHERE p.user=:user

但是这个WHERE会检查主题中的所有帖子,我只想检查第一个帖子(这个用户将被视为主题的作者)。

感谢

我在这里找到了一个更好的解决方案:JPQL中的索引元素访问

基本上我可以在JPQL中使用INDEX()来描述集合的索引:

SELECT t FROM Topic t JOIN t.posts p WHERE p.user = :user AND INDEX(p) = 0

为了使INDEX()工作,我需要在Topic实体的posts字段上添加一个@OrderedColumn

@OrderColumn(name = "order_column")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "topic")
private List<Post> posts = new ArrayList<>();

问题是,Hibernate中有一个错误,它不同时支持@OrderedColumnmappedBy:Hibernate 3.5 中的JPA 2.0@OrderColumn注释

作为解决方案,我在实体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();
}

只需使用本地查询,在联接时进行子选择,这样

@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);

相关内容

  • 没有找到相关文章

最新更新