我有3个实体:
具有设置图库的用户。 有设置照片的画廊。
现在我想按创建时间选择所有用户的最后3张照片(用户可能有10个画廊,每张照片有100张照片)。我该怎么做jpql?
我不知道如何获得前3张照片(从p中选择前3位):
查询q = em.createQuery("选择你, (从p中选择前3名) 来自用户u left join u.galleries g left join g .photos p");
我知道我只能通过以下方式获得前3张照片的用户:
查询q = em.createQuery("选择u,p来自User u left join u.galleries g left join g.photos p其中u.id =:userId")。setMaxResults(3);
但是一个jpql中的所有用户呢?
提前致谢。
答案 0 :(得分:0)
你碰巧在PostgreSQL上工作,你可以使用窗口函数来按用户选择前3个photo.ids:
List<Long> photoIds = (List<Long>)
em.createNativeQuery(
"select data.p_id
from
(
SELECT p.id as p_id, row_number() as rw OVER w as rw
FROM photo p
INNER JOIN galley g on g.id = p.galery_id
INNER JOIN user u on u.id = g.user_id
WINDOW w AS (PARTITION BY u.id ORDER BY p.creation_time DESC)
) data
where rw <= 3", Long.class)
.getResultList();
然后使用这些ID您可以获取照片/图库/用户:
List<Photo> photos = (List<Photo>)
em.createQuery(
"select p
from Photo p
join fetch p.gallery g
join fetch g.user u
where p.id in (:photoIds)")
.setParameter("photoIds", photoIds)
.getResultList();
然后,您可以从照片列表中重新创建用户/图库/照片。
没有其他方法可以使用JPQL仅选择已加入的子实体集合的部分视图。