2012-09-24 89 views
1

我的模型:JPA:如何篩選關聯?

@Entity 
class Person { 
    @Id 
    long id; 
    @OneToMany 
    Set<Employment> employments = new HashSet<Employment>(); 
} 

@Entity 
class Employment { 
    @Id 
    long id; 
    @ManyToOne 
    Company company; 
    Date from; 
    Date until; 
} 

這是一個Person而這一個時間間隔限制的Company之間的關聯。

我正在查找JPA標準查詢以在給定時間選擇所有Person s及其就業情況。

預期的結果是含有所有List<Person>,其中該集合中的每個Personemployments僅含有符合某些標準(或沒有emplyments在所有),該外水。

@Where不是明智的方法,因爲用於過濾的僱傭標準是可變的,例如,我想在任何時候選擇一個人的所有工作。

這是一個合理的事情嗎?任何建議如何做到這一點不同?

回答

1

不,這是不合理的事情。實體應該表示數據庫中的數據,而不是特定查詢返回的日期。

我只需簡單地將一個ManyToOne關聯從Employment添加到Person,然後搜索就業情況。如果您需要這些人員,只需重複就業並將每個工作人員添加到一個集合中即可。如果你想在這個日期與他們的就業有關的人,你可以使用自定義類,或MultiMap<Person, Employment>

String hql = "select employment from Employment employment" 
      + " left join fetch employment.person" 
      + " where :date between employment.startDate and employment.endDate"; 
List<Employment> employments = session.createQuery(hql) 
             .setDate("date", date) 
             .list(); 
+0

謝謝你的提示!搜索關係而不是主要實體是一個不錯的主意。 –