[英]JPQL select all objects, but setMaxResult on object collections
我有3個實體:
擁有畫廊的用戶。 設有照片集的畫廊。
現在,我想按創建時間選擇所有用戶及其最后3張照片(用戶可能有10個畫廊,每個畫廊可能有100張照片)。 我該如何做jpql?
我不知道如何獲取下面的前3張照片(從p中選擇前3張照片):
查詢q = em.createQuery(“從用戶u中選擇u, (從p中選擇前3個) u左連接u。圖庫g左連接g.photos p”);
我知道我只能通過以下方式獲得前三張照片的用戶:
查詢q = em.createQuery(“從用戶中選擇u,p從用戶u左連接u。圖庫g左連接g.photos p,其中u.id =:userId”)。setMaxResults(3);
但是一個jpql中的所有用戶呢?
提前致謝。
您碰巧在PostgreSQL上工作時,可以使用窗口函數按用戶選擇前3個photo.id:
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在已聯接的子實體集合上選擇部分視圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.