2012-02-05 58 views
0

我遇到一些麻煩設置以下查詢where條款:標準的API集謂詞的where子句MapJoin

CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<Configuration> cq = cb.createQuery(Configuration.class); 
    Root<Configuration> conf = cq.from(Configuration.class); 
    MapJoin<Configuration, String, Component> mapJoin = conf.join(Configuration_.components, JoinType.LEFT); 
    cq.where(cb.and(cb.like(mapJoin.key(), "%abc%"), 
      cb.like(mapJoin.value().get(Component_.displayName), "%def%"))); 
    cq.select(pc); 

我基本上是試圖讓包含在組件的條目中的所有配置 - 鍵包含「abc」且其值包含「def」的映射。 我期望這個工作,基於從http://blogs.oracle.com/ldemichiel/entry/java_persistence_2_0_proposed,部分Maps的示例代碼,但顯然我錯過了一些東西。

實體具有以下結構:

@Entity 
public class Configuration{ 
    @Id 
    protected Long id;  
    @OneToMany 
    protected Map<String, Component> components; 
} 

@Entity 
public class Component{ 
    @Id 
    protected Long id;  
    protected String displayName; 
} 

預先感謝您,感謝任何幫助。

回答

1

你會得到什麼錯誤?

您的代碼沒有意義。默認情況下,在JPA中,假設Map鍵來自目標對象,並且如果您沒有使用@MapKey爲該鍵設置目標字段,那麼默認情況下它被假定爲對象的Id。在這種情況下,你的密鑰是一個字符串,身份證是一個長,所以我看不到這個工作呢?

您需要提供@MayKey或@MapKeyColumn以將關鍵字獨立存儲在連接表中。

+0

謝謝,這讓我走向了正確的方向 – glasspill 2012-02-07 20:51:20