简体   繁体   English

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

[英]HQL query for Many To Many Associations for self referenced object

I hava this class: 我有这个课:

    @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

If I need all friend of a User I can get them by simply calling getAllFriends(). 如果我需要用户的所有朋友,我可以通过简单地调用getAllFriends()来获取它们。 But I want to add some restriction to the maximum number of returned friends. 但我想为最多返回的朋友添加一些限制。 So I want to select all friends using HQL. 所以我想用HQL选择所有朋友。 I want something like this (my hql is incorrect, just to show the idea): 我想要这样的东西(我的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();

Is it possible to create such a query? 是否可以创建这样的查询?

UPDATE: I have SQL query whiсh fits my requirements. 更新:我有SQL查询符合我的要求。 Maybe someone can help me to translate it to HQL? 也许有人可以帮我翻译成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);

HQL does not support UNION clause (there is open issue: https://hibernate.atlassian.net/browse/HHH-1050 ), so this is a little bit harder, but i think you can do something like this: HQL不支持UNION子句(有开放问题: https//hibernate.atlassian.net/browse/HHH-1050 ),所以这有点难,但我认为你可以这样做:

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
    ) 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM