【问题标题】:JPQL select all objects, but setMaxResult on object collectionsJPQL 选择所有对象,但在对象集合上设置 MaxResult
【发布时间】:2014-08-08 06:07:26
【问题描述】:

我有 3 个实体:

拥有设置画廊的用户。 已设置照片的图库。

现在我想按创建时间选择所有用户的最后 3 张照片(用户可能有 10 个画廊和每个画廊 100 张照片)。 jpql怎么办?

我不知道如何获得下面的前 3 张照片(从 p 中选择前 3):

Query q = em.createQuery("select u, (select top 3 from p) from User u left join u.galleries g left join g.photos p ");

我知道我只能通过以下方式获得一位用户的前 3 张照片:

Query q = em.createQuery("select u, p from User u left join u.galleries g left join g.photos p where u.id =:userId").setMaxResults(3);

但是一个 jpql 中的所有用户呢?

提前致谢。

【问题讨论】:

  • 如何知道最后3张照片,是上传时间还是创建时间?
  • 哪个部分你不明白,join、sort还是limit?
  • 请使用created time 更新您的问题以用于最后 3 张照片,以及到目前为止您尝试过的代码和结果!

标签: java hibernate orm jpql


【解决方案1】:

您碰巧在 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 仅选择连接的子实体集合的部分视图。

【讨论】:

  • 我明白你的做法。从多方面查询而不是从一侧查询。好主意。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 2013-03-26
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-19
相关资源
最近更新 更多