WHERE中的JPQL单一集合元素

时间:2015-02-19 22:16:28

标签: java database hibernate join jpql

我正在创建一个小型论坛。实体及其关系是这样的:

实体TopicOneToMany的关联PostPostManyToOne的关联User

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

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

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

由于

2 个答案:

答案 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中存在一个错误,它不支持@OrderedColumnmappedByJPA 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);