我有以下持久化课程:
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.properties是CodeValue而不是地图!
我也尝试在不创建别名的情况下访问此字段,这样hibernate似乎可以访问正确的 …