我有这门课:
@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
如果我需要用户的所有朋友,我可以通过简单地调用 getAllFriends() 来获得它们。但是我想对返回朋友的最大数量添加一些限制。所以我想选择所有使用 HQL 的朋友。我想要这样的东西(我的 hql 不正确,只是为了展示这个想法):
String hql = "Select u FROM User u inner join u.friendOf fof WHERE fof.userId = :userId inner join u.friends fs WHERE fs.userId = :userId";
Query query = sessionFactory.getCurrentSession().createQuery(hql);
query.setParameter("userId", userId);
List<User> results = query.setMaxResults(maxResults).setFirstResult(firstResult).list();
是否可以创建这样的查询?
更新:我有符合我要求的 SQL 查询。也许有人可以帮我把它翻译成 HQL?
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);