簡體   English   中英

JPQL選擇所有對象,但對對象集合使用setMaxResult

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM