转自http://stackoverflow.com/questions/17064484/hql-query-for-many-to-many-associations-for-self-referenced-object
@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;
}
If I need all friend of a User I can get them by simply calling getAllFriends().But I want to add some restriction to the maximum number of returned friends. So I want to select all friends using HQL. I want something like this (my hql is incorrect, just to show the idea):
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
)