微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

给定另一个表中的朋友关系,从 Hibernate 获取对象列表

如何解决给定另一个表中的朋友关系,从 Hibernate 获取对象列表

我将 this post 作为解决问题的尝试的一部分,尽管最终产品的计算成本非常高。

我有以下实体(为简单起见被截断)

@Entity
public Post {
    @Id
    private Long id;
    @ManyToOne
    private Person author;
    private String post;
    @Temporal(TemporalType.TIMESTAMP)
    private Date postDate;
    //getter setters
}

@Entity
public Person {
    @Id
    private Long id;
    private String name;
    //getter setters
}

@Entity
public Friendship {
    @Id
    private Long id;
    @ManyToOne
    private Person owner;
    @ManyToOne
    private Person friend;
    //getter setters
}

我正在尝试获取某个用户及其朋友的最新帖子。用户查询很简单,如下所示:

Query query = em.createquery("SELECT p FROM Post p WHERE p.author = :user ORDER BY p.postDate DESC);
query.setParameter("user",user);
query.setMaxResults(50)
return query.getResultList();

然而,通过单一查询获得好友和用户的帖子列表似乎是不可能的。我的最大努力尝试是按照上面的消息为每个朋友重复(即:从朋友表中获取朋友,这也相当简单),然后再次按发布日期对合并列表进行排序,这是我想要避免的因为它真的很慢。

示例代码

Query q1 = em.createquery("SELECT F from Friendship f WHERE p.owner = :user or p.friend = :user");
q1.setParameter("user",user);
List<Friendship> friendshipList = q1.getResultList();

List<Person> friends = new ArrayList<>();
friends.add(user);

for (Friendship f : friendshipList) {
    if (f.owner.equals(user)) {
        friends.add(f.getFriend());
    } else {
        friends.add(f.getowner());
    }
}

List<Post> result = new ArrayList<>();

for (Person p : friends) {
    Query query = em.createquery("SELECT p FROM Post p WHERE p.author = :user ORDER BY p.postDate DESC");
    query.setParameter("user",p);
    query.setMaxResults(50)
    result.addAll(query.getResultList());
}

//sort by date and return

有没有办法改进这个解决方案?

解决方法

你可以使用

SELECT DISTINCT p FROM Post p 
WHERE p.author IN 
(SELECT f.owner from Friendship f WHERE f.owner = :user or f.friend = :user) 
OR 
p.author IN 
(SELECT f.friend from Friendship f WHERE f.owner = :user or f.friend = :user) 
ORDER BY p.postDate DESC

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。