2011-12-05 68 views
0

我有兩個實體,一個是事件,另一個是用戶。用戶可以喜歡活動,因此它有一個喜歡的活動列表(記錄在一個聯合表格中)。我想使用JPA 2.0構建一個類型安全查詢來計算有多少人喜歡事件id中的事件。任何人都可以幫助我嗎?謝謝。構建一個動態的,類型安全的查詢

下面是實體的代碼。

@Entity 
@Table(name = "events") 
public class Event extends BaseEntity{ 
    @Id 
    @Column(name = "event_id") 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    protected Long eventId; 

    @Column(name = "title", length = 200) 
    protected String title; 

     //getter and setter.... 
} 



@Entity 
@Table(name = "user") 
public class User{ 
    @Id 
    @Column(name = "login", length = 64) 
    protected String login; 

    @OneToMany(cascade = CascadeType.ALL) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    @JoinTable(name = "user_events", 
     joinColumns = {@JoinColumn(name = "login")}, 
     inverseJoinColumns = {@JoinColumn(name = "event_id")}) 
    protected List<Event> events; 

    //getter and setters... 
} 

回答

0

由於您的查詢基本上將是靜態的且帶有參數是事件ID,我會創造一個@NamedQuery,然後用entity manager to create一個TypedQuery。既然你正在尋找計數,那麼這個類型可能就是一個長計。

該查詢可能類似於select count(u) from User u where :event member of u.events,假設您有事件,而不僅僅是id。

如果你對NamedQuery有什麼不滿,你可以使用Criteria API來做同樣的事情,但是在這個查詢是如此靜態的地方,我沒有看到這麼做。

+0

請給我更多的細節?你談到了使用實體管理器來創建一個TypedQuery,你的意思是一個JPQL查詢嗎?但它不是類型安全的。我想要的是使用JPA 2.0提供的Criteria API。 – John

+0

但我確實希望使用Criteria API來與我的其他代碼保持一致。那麼你可以給我看一個示例代碼嗎?謝謝。 – John

+0

此頁面的下半部分http://www.objectdb.com/java/jpa/query/jpql/select會講述如何創建Criteria查詢的全部內容。您只需要將上面給出的查詢(或您喜歡的其中一個)轉換爲標準查詢。 – digitaljoel