我有一个使用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查询一样。
是否可以编写这样的查询?或者我是否需要进行其他一些黑客来过滤已批准的评论?
感谢。
答案 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(...);