JPQL选择所有对象,但在对象集合上选择setMaxResult

时间:2014-06-18 04:39:33

标签: java hibernate orm jpql

我有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中的所有用户呢?

提前致谢。

1 个答案:

答案 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仅选择已加入的子实体集合的部分视图。