2013-12-17 100 views
1

目前使用的EclipseLink JPA 2.4.2有一堆通過@IdClass方法,使用組合鍵存儲在數據庫中的對象,即:如何選擇包含複合鍵的對象列表?

@Entity 
@IdClass(ThingsPK.class) 
public class MyBunchOfThings { 

    @Id 
    @GeneratedValue(generator="ID_SEQ") 
    @SequenceGenerator(name="ID_SEQ") 
    private Integer id; 

    @Id 
    private Date timestamp; 

    ... 

} 

public class ThingsPK { 

    private Integer id; 

    private Date timestamp; 

} 

如果我需要通過選擇一些這些東西select in子句中,如何通過JPQL和複合主鍵來完成此操作?

例如

List<ThingsPK> keyList = ... 
TypedQuery<MyBunchOfThings> query = em.createQuery("SELECT t FROM MyBunchOfThings t WHERE t.??? IN :keyList", MyBunchOfThings.class); 
query.setParameter("keyList", keyList); 
List<MyBunchOfThings> foundThings = query.getResultList(); 
+0

SELECT t FROM MyBunchOfThings t WHERE (t.id=:id1 AND t.timestamp=:ts1) OR (t.id=:id2 AND t.timestamp=:ts2) OR... 

或者你可以嘗試下面的查詢?我的意思是你爲什麼不用Integer留下它? –

+0

我們在時間戳上使用Oracle分區。 – tellisnz

回答

0

如果要使用JPQL運算符IN,則使用@EmbeddedId。否則,使用和/或查詢,是這樣的:你爲什麼需要也是一個@Id了時間戳

List<ThingsPK> keyList = ... 
TypedQuery<MyBunchOfThings> query = em.createQuery("SELECT t FROM MyBunchOfThings t WHERE t IN :keyList", MyBunchOfThings.class); 
+0

對不起,應該指定我們綁定到IdClass,因爲Integer id是一個序列,並且在使用EmbeddedId/Embeddable時,這些似乎不會更新。這是和/或唯一的方式與IdClass? – tellisnz

+0

我不是專家,但目前我沒有看到其他可能性。 –

+0

檢查我的更新答案。 –

相關問題