Reputation: 15
I need a JPQL query that returns:
I tried something like:
SELECT t
FROM Tweet t
WHERE t.author.id = :userId
OR t.author.id IN (
SELECT u.followedUsers
FROM User u
WHERE u.id = :userId
)
Only to find out that the subquery has wrong syntax. Also I cannot call the relation table User_User, like I would in SQL, because JPA doens't recognize it
User
@Entity
public class User {
@Id
@GeneratedValue
private long id
@ManyToMany(mappedBy = "followedUsers")
private Set<User> followers;
@ManyToMany
private Set<User> followedUsers;
}
Tweet
@Entity
public class Tweet {
@Id
@GeneratedValue
private long id;
@ManyToOne
private User author;
}
Upvotes: 1
Views: 1015
Reputation: 526
given this query
OR t.author.id IN (
SELECT u.followedUsers
FROM User u
WHERE u.id = :userId
)
you are trying to find an Integer (t.author.id)
in a list of User
objects !
I think this should work :
SELECT t
FROM Tweet t
WHERE t.author.id = :userId
OR t.author MEMBER OF (
SELECT u.followedUsers
FROM User u
WHERE u.id = :userId
)
Edit
... MEMBER OF (subquery)...
isn't allowed, but merging the subquery into its parent resolves this.
SELECT DISTINCT(t)
FROM Tweet t, User u
WHERE t.author.id = :userId
OR (t.author MEMBER OF u.followedUsers AND u.id = :userId)
Upvotes: 0
Reputation: 19060
I have the habit of making JPQL queries more similar to SQL queries. So, my suggestion:
SELECT t FROM Tweet t
JOIN t.author a
WHERE a.id = :idUser
OR a.id IN (SELECT followedUser.id
FROM User u
JOIN u.followedUsers followedUser
WHERE u.id = :idUser)
Upvotes: 1