使用with子句的hibernate查询无法获取特定值

时间:2015-01-01 10:16:43

标签: sql hibernate hql

我正在使用以下hql来获取结果

feeds = (List<Album>) session.createQuery(
                    "select distinct album from Album as album "
                    + "left join album.postImageses as pi with pi.isAlbumCover=:isCover "
                    + "where album.atom.id=:aid ")
                    .setParameter("isCover", "Yes")
                    .setParameter("aid", id)
                    .list();

此查询正常运行。 但问题是,我只想从postImageses获取其isAlbumCover值为&#39;是&#39; 但上面的查询是获取所有图像(图像是否是专辑封面)。

那么如何才能仅使用isAlbumCover='Yes'获取图像(而不是其他图像)。 如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

Hibernate无法为您提供部分一对多的结果。你总是让所有的孩子都保持一致。

您需要将查询向上翻转:

select ps
from PostImage ps
inner join fetch ps.album albm
inner join fetch albm.atom atm
where ps.isAlbumCover = :isCover and atm.id = :aid

此查询假设您在Album和PostImage之间存在双向关联,因此PostImage也有@ManyToOne相册引用。

对于证明这是不可能的,这就是Hibernate documentation所说的:

  

获取连接通常不需要分配别名,因为   关联对象不应该在where子句中使用(或任何   其他条款)。

因此,获取不受where子句的影响。在您的情况下, with 子句最多可以过滤根实体(Album),但所有关联的集合(postImageses)都将受fetching policy的约束。

因为您没有明确使用 fetch 指令,这意味着查询将起诉映射获取策略。如果一对多关联是LAZY,则赢得;在此查询中初始化。一旦你访问它,Hibernate将发出一个新的查询来初始化它,这就是 with 子句不过滤子集合的原因。