HQL - нужна помощь по запросу - PullRequest
1 голос
/ 08 июня 2011

У меня есть объекты: Tweet и User.

Tweet имеет author, который является экземпляром класса User.Пользователь следит за другими пользователями, а также отслеживает пользователей, следующих за ним:

@ManyToMany
public List<User> following;

@ManyToMany(mappedBy = "following", fetch = FetchType.LAZY)
public List<User> followedBy;

Теперь я хочу загрузить твиты пользователей, за которыми я сейчас следую.Я попробовал это:

"FROM Tweet AS tweet " +
                "JOIN tweet.author as author " +
                "JOIN author.followedBy as followedBy " +
                "WHERE tweet.author = followedBy AND ? in followedBy ORDER BY dateCreated DESC"

Но это не работает.Я засасываю сложные запросы.

EDIT

Сгенерированный запрос, который я скопировал из сгенерированного исключения:

SELECT TWEET0_.ID AS ID10_, TWEET0_.AUTHOR_ID AS AUTHOR4_10_, TWEET0_.CONTENT AS CONTENT10_, TWEET0_.DATECREATED AS DATECREA3_10_ 
  FROM TWEET TWEET0_ 
  INNER JOIN USER USER1_ ON TWEET0_.AUTHOR_ID=USER1_.ID 
    WHERE USER1_.ID IN 
      (SELECT .[*] FROM USER USER2_, USER_USER FOLLOWING3_, USER USER4_ WHERE USER2_.ID=FOLLOWING3_.FOLLOWEDBY_ID AND FOLLOWING3_.FOLLOWING_ID=USER4_.ID AND USER2_.ID=?) 
ORDER BY TWEET0_.DATECREATED DESC LIMIT ?

Редактировать 2

К сожалениютеперь я получаю IllegalArgumentException:

    IllegalArgumentException occured : 
org.hibernate.QueryException: illegal attempt to dereference collection [user2_.id.following] with element property reference [id] [select tweet from models.Tweet tweet join tweet.author author where author in (select user.following.id from models.User user where user.id = :id) order by tweet.dateCreated desc] 

1 Ответ

1 голос
/ 08 июня 2011

Я бы использовал здесь подзапрос:

select tweet from Tweet tweet
join tweet.author author
where author in 
(select following.id from User user join user.following following where user.id = :id) 
order by tweet.dateCreated desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...