2012-05-20 41 views
1

我有2個表 一表 - 事件 二表 - 類別JPQL加入2個表:寫JPQL

@Entity 
public class Event { 

@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long eventId; 
private String name; 
@ManyToOne 
@JoinColumn(name = "category_id") 
private EventCategory category; 
//getters and setters 
} 

@Entity 
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "CATEGORY" })) 
public class EventCategory { 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long categoryId; 
@NotNull 
private String category; 
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL) 
private List<Event> events; 
} 

現在我想它的類是某個值的所有事件。我對jpa非常陌生。有困難的時候寫這個查詢。如果你能幫助我,這將會有所幫助。

編輯:我在事件表中存儲categoryId。我希望能夠按類別名稱進行搜索。類別名稱僅保存在類別表中。所以我認爲我需要與類別表進行連接。

+0

'category.getEvents()'? –

+0

Yeha,找到類別(EntityManager.find(Object Id)?),只是得到類別。 ? – esej

+0

正如我在前面的評論中提到的那樣,我在events表中存儲了categoryId。我希望能夠按類別名稱進行搜索。類別名稱僅保存在類別表中。所以我想我需要加入類別表的Event表。 – CRS

回答

5

有了這樣的查詢:

final String query = "SELECT e FROM Event e WHERE e.category = :category"; 

可以檢索記錄與任意數量的手段,但在這裏是一個:

final EventCategory category = ...; 
TypedQuery<Event> query = entityManager.createQuery(query, Event.class); 
query.setParameter("category", category); 
final List<Event> events = query.getResultList(); 

*編輯*

默認情況下,我上面說明的方法將基於prima爲您的類別對象定義的密鑰。如果您想通過其他屬性進行搜索,則需要在JPQL中指定:

final String query = "SELECT e FROM Event e WHERE e.category.name = :categoryName"; 

final String categoryName = ...; 
TypedQuery<Event> query = entityManager.createQuery(query, Event.class); 
query.setParameter("categoryName", categoryName); 
final List<Event> events = query.getResultList(); 
+0

不知道這是否會起作用。我在事件表中存儲categoryId。我希望能夠按類別名稱進行搜索。類別名稱僅保存在類別表中。所以我認爲我需要與類別表進行連接。 – CRS

+1

@CRS - 你需要編輯你的原始問題,然後提到。請參閱編輯。 – Perception

+0

@Perception使用你的查詢需要一個已經有EventCategory - >我們已經有category.getEvents()中的事件... – esej