我有这个实体:

@ManyToOne
private User user1;
@ManyToOne
private User user2;
... and other properties of the friendship

每段友谊只有一个实例/记录(不是2个),所以在约翰是简的朋友而不是相反的情况下,不会有任何问题。条目也被规范化,因此具有最低id的友谊成员是Friendship,另一个成员是user1,这意味着我可以使用简单的唯一约束来防止重复条目。
为了获得某个用户的友谊,我使用
user2
是否可以将其映射到WHERE user1 = :me OR user2 = :me@OneToMany Set<Friendship>属性上?
User具有其他属性,因此这不仅仅是Friendship

最佳答案

简短的回答是否定的。对于双向获取,我相信实现您所要求的唯一方法是使用命名查询。大致如下:

@Entity
@NamedQuery(name="User.friendships", query="
    select u
    from User u
    where u in (
        select f.User1
        from Friendship f
        where f.User2.id = :userId
    ) or u in (
        select f.User2
        from Friendship f
        where f.user1.id = :userId
)")
public class User {

private Set<User> friends = new HashSet<User>()

public Collection<User> getFriendships(Session s) {
    return s.getNamedQuery("User.friendships")
        .setParameter("userId", this.id)
        .list();
}

}
我过去这样做的方式是以某种方式反规范化联接表,无论是通过重复的列(在每个方向映射一个关联)还是重复的行。这两种方法都可以简化提取过程。

09-26 08:05