我在设置以下查询的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;
}
提前感谢您,任何帮助表示赞赏。
答案 0 :(得分:1)
你得到什么错误?
您的代码没有意义。默认情况下,在JPA中,Map键被假定来自目标对象,如果您没有使用@MapKey将目标字段设置为用于键,则默认情况下它被假定为对象的Id。在这种情况下,你的密钥是一个字符串,Id是一个长的,所以我看不到这个工作吗?
您需要提供@MayKey或@MapKeyColumn以在关联表中独立存储密钥。