Well, I already covered how you can handle this challenge several times in the past, so I’ll not do that again. What I actually did is quite different. Instead of having to deal with the complexity (which is possible) I decided to remove it entirely.
The solution to my problem is to simplify the model:
Which is represented as the following physical data model:
Now, querying for this is about as simple as you can get:
select user0_.Id as Id2_0_, book2_.Id as Id0_1_, user0_.Name as Name2_0_, user0_.Street as Street2_0_, user0_.Country as Country2_0_, user0_.City as City2_0_, user0_.ZipCode as ZipCode2_0_, user0_.HouseNumber as HouseNum7_2_0_, book2_.Name as Name0_1_, book2_.ImageUrl as ImageUrl0_1_, book2_.Image as Image0_1_, book2_.Author as Author0_1_, queue1_.[User] as User1_0__, queue1_.Book as Book0__, queue1_.[Index] as Index3_0__ from Users user0_ inner join UsersWaitingBooks queue1_ on user0_.Id = queue1_.[User] inner join Books book2_ on queue1_.Book = book2_.Id where user0_.Id = 1 /* @p0 */
De-normalizing the model has significantly improved my ability to work with it.