小编mic*_*car的帖子

使用Hibernate Criteria过滤Map中的键和值

我有以下持久化课程:

public class Code {

  @ElementCollection(targetClass = CodeValue.class)
  @MapKeyClass(CodeProperty.class)
  @JoinTable(name="code_properties")
  @CreateIfNull( value = false )
  private Map<CodeProperty,CodeValue> propertiesMap =
      new HashMap<CodeProperty, CodeValue>();

  ...
}

public class CodeProperty {
    private String name;
    ...
}

public class CodeValue {
    private String value;
    ...
}
Run Code Online (Sandbox Code Playgroud)

而我试图让一些性质我有过滤代码列表propertiesMap(例如,其中一个名为"颜色"属性的值为"绿色"的代码.

我使用以下基本标准:

Criteria criteria = currentSession()
    .createCriteria(Code.class, "code")
    .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)

当我尝试执行收集过滤器时(如此处所示):

criteria.createAlias("code.properties", "p");
criteria.add(Restrictions.eq("p.foo", "test1"));
criteria.setFetchMode("code.properties", FetchMode.JOIN);
criteria.list();
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

org.hibernate.QueryException: could not resolve property: foo of: com.example.CodeValue
Run Code Online (Sandbox Code Playgroud)

这意味着,我真的不明白为什么,hibernate正在考虑code.propertiesCodeValue而不是地图!

我也尝试在不创建别名的情况下访问此字段,这样hibernate似乎可以访问正确的 …

java hibernate hibernate-criteria

11
推荐指数
1
解决办法
1888
查看次数

标签 统计

hibernate ×1

hibernate-criteria ×1

java ×1