Hibernate HQL查询自引用对象的多对多关联

Hibernate HQL查询自引用对象的多对多关联,hibernate,orm,many-to-many,jpa-2.0,hql,Hibernate,Orm,Many To Many,Jpa 2.0,Hql,我上过这门课: @Entity @Table(name = "USERS") public class User { @Id @Column(name = "USER_ID") @GeneratedValue private long userId; ... @ManyToMany(fetch = FetchType.LAZY) @JoinTable(name = "FRIENDS", joinColumns =

我上过这门课:

    @Entity
    @Table(name = "USERS")
    public class User {

    @Id
    @Column(name = "USER_ID")
    @GeneratedValue
    private long userId;
    ...
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "FRIENDS", joinColumns = @JoinColumn(name = "USER_ID"), inverseJoinColumns = @JoinColumn(name = "FRIEND_ID"))
        private Set<User> friends;


    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "FRIENDS", joinColumns = @JoinColumn(name = "FRIEND_ID"), inverseJoinColumns = @JoinColumn(name = "USER_ID"))
        private Set<User> friendOf;

   ...
    public Set<User> getAllFriends() {
      allFriends = new HashSet<User>();
      allFriends.addAll(friends);
      allFriends.addAll(friendOf);
      return allFriends;
}
   // getters and seters

HQL不支持
UNION
子句(有一个未决问题:),所以这有点困难,但我认为您可以这样做:

select u
from User u
where u.userId in (
        select fr.userId
        from User u1
        inner join u1.friends fr
        where u1.userId = :userId
    ) 
    or u in (
        select fr.userId
        from User u2
        inner join u2.friendOf fr
        where u2.userId = :userId
    ) 

谢谢,伦尔。但这对我不起作用。我有一个选项:java.sql.SQLSyntaxErrorException:unexpected token:USERS required:)是的,你是对的。HQL可以解析它,但生成的SQL是错误的。我更新了我的答案。
select * from users where user_id in (
select 
 (case  
  when user_id = :userId then friend_id 
  else user_id 
 end) as id
from friends
where user_id = :userId or friend_id = :userId);
select u
from User u
where u.userId in (
        select fr.userId
        from User u1
        inner join u1.friends fr
        where u1.userId = :userId
    ) 
    or u in (
        select fr.userId
        from User u2
        inner join u2.friendOf fr
        where u2.userId = :userId
    )