2014-12-19 97 views
0

我有一個使用Postgre 9.3和JPA2.1(Hibernate實現)的Spring MVC應用程序。我有一個類「電影」,其中有評論集。我想編寫一個JPA NamedQuery,它返回Movie的所有細節,但只返回Approved評論。評論可以有其他州,但我只想顯示已批准的評論。JPA查詢基於實體列表的屬性過濾

我的類看起來像下面的:我已經寫不過濾的審查,並與所有評論返回電影

@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

你可以嘗試使用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(...); 
+0

這並沒有爲我工作的時候只是激活過濾器,我得到異常org.hibernate.HibernateException:否當我嘗試在我的Movie DAO類中啓用它時,配置了[onlyApproved]這樣的過濾器。這裏是我的DAO代碼: \t會話會話; \t \t session = em.unwrap(Session.class); \t session.enableFilter(「onlyApproved」); \t \t TypedQuery 查詢= em.createNamedQuery( 「Movie.findMovieByIdAndApprovedReviews」, \t \t \t Movie.class); \t query.setParameter(「movieId」,movieId); – AAgg

+0

我忘了在我的回答中添加@ @ FilterDef。你應該把它放在課堂上。檢查我更新的答案。 –

+0

它仍然不工作,我不知道哪裏可能是錯誤。我必須在我的UserReview類中添加任何內容嗎?我現在使用的是舊的NamedQuery Movie.findMovieById,因爲我認爲Filter會給我返回所需的結果。 – AAgg