'How to query an Entity from a Many-to-Many realtionship dependendt on two ore more conditions in Ktor with the Kotlin Exposed Framework?
I have 3 entities:
| User |
|---|
| id: Int |
| name: String |
| Room |
|---|
| id: Int |
| name: String |
| RoomUser |
|---|
| id: Int |
| room_id: Int (Reference on Room.id) |
| user_id: Int (Reference on User.id) |
Now lets say we have 2 rooms and 3 users:
Rooms:
| id | name |
|---|---|
| 1 | Room1 |
| 2 | Room2 |
Users:
| id | name |
|---|---|
| 3 | User3 |
| 7 | User7 |
| 9 | User9 |
RoomUsers:
| id | room_id | user_id |
|---|---|---|
| 1 | 1 | 3 |
| 2 | 1 | 7 |
| 3 | 2 | 7 |
| 4 | 2 | 9 |
As you can see, User3 and User7 are in the room Room1 and User7 and User9 are in the room Room2.
In my use case I have given for example 2 users. Now I want to get the room, in which these both Users are.
In this case, when I have given the users User3 and User7 I want to get the room Room1 or when I have given the users User7 and User9 I want to get the room Room2.
How can I write an query with the Kotlin Exposed Framework to get this specific room?
Solution 1:[1]
In SQL notation it should be like:
SELECT room_id
FROM RoomUsers
where user_id in (3,7)
GROUP BY room_id
HAVING count(*) = 2
In Exposed:
RoomUsers
.slice(RoomUsers.roomId)
.select{
RoomUsers.userId inList listOf(User3.id, User7.id)
}
.groupBy(RoomUsers.roomId)
.having {
RoomUsers.userId.count() eq 2
}.map {
it[RoomUsers.roomId]
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Tapac |
