【问题标题】:HQL query for Many To Many Associations for self referenced object自引用对象的多对多关联的 HQL 查询
【发布时间】:2013-06-08 12:07:56
【问题描述】:

我有这门课:

    @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);

【问题讨论】:

    标签: hibernate orm many-to-many jpa-2.0 hql


    【解决方案1】:

    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
        ) 
    

    【讨论】:

    • 谢谢,@lunr。但这对我不起作用。我有一个例外:java.sql.SQLSyntaxErrorException:意外令牌:需要用户:)
    • 是的,你是对的。 HQL可以解析,但是生成的SQL是错误的。我更新了我的答案。
    猜你喜欢
    • 2012-09-06
    • 2014-10-29
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2015-03-31
    相关资源
    最近更新 更多