标准api在MapJoin的where子句中设置谓词

时间:2012-02-05 19:24:50

标签: jpa jpa-2.0 criteria criteria-api

我在设置以下查询的where子句时遇到了一些麻烦:

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”的components-Map中的条目的所有配置。 根据{{​​3}}部分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 个答案:

答案 0 :(得分:1)

你得到什么错误?

您的代码没有意义。默认情况下,在JPA中,Map键被假定来自目标对象,如果您没有使用@MapKey将目标字段设置为用于键,则默认情况下它被假定为对象的Id。在这种情况下,你的密钥是一个字符串,Id是一个长的,所以我看不到这个工作吗?

您需要提供@MayKey或@MapKeyColumn以在关联表中独立存储密钥。