JPA基于实体列表的属性查询过滤

时间:2014-12-19 13:41:22

标签: hibernate jpa postgresql-9.3 named-query jpa-2.1

我有一个使用Postgre 9.3和JPA2.1(Hibernate实现)的Spring MVC应用程序。我有一部电影'电影'其中有一组评论。我想写一个JPA NamedQuery,它返回给我电影的所有细节,但只返回Approved评论。评论可以有其他州,但我想只显示已批准的评论。

我的课程如下所示:

@NamedQueries({
@NamedQuery(name="Movie.findMovieById",
    query="SELECT c FROM Movie c WHERE c.id = :MovieId"),
@NamedQuery(name="Movie.findMovieByIdAndApprovedReviews",
    query="SELECT c FROM Movie c INNER JOIN c.reviews r WHERE c.id = :MovieId AND r.state = 'USER_REVIEW_APPROVED'"),
})
public class Movie implements Serializable {

    //Primary Key
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    //Movie Name
    @Column(name = "name")
    private String name;

    //One Movie can have many reviews hence OneToMany
    @OneToMany(fetch=FetchType.EAGER, mappedBy="Movie")
    private Set<UserReview> reviews;

    .
    .
    .

}

我写过的查询并不过滤评论并返回带有所有评论的电影;它与上面显示的findMovieById查询一样。

是否可以编写这样的查询?或者我是否需要进行其他一些黑客来过滤已批准的评论?

感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用Hibernate filters

@FilterDef(name="onlyApproved")
public class Movie implements Serializable {

...

@Filter(name="onlyApproved", condition="state = 'USER_REVIEW_APPROVED'")
@OneToMany(fetch=FetchType.EAGER, mappedBy="Movie")
private Set<UserReview> reviews;

然后,只需在执行查询时激活过滤器

Session session = entityManager.unwrap(Session.class);
session.enableFilter("onlyApproved");
entityManager.createNamedQuery(...);