我有以下的持久类:使用Hibernate的标准地图中的过滤键和值
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;
...
}
而我试图让一些性质我propertiesMap在过滤代码列表(例如其中,财产名为“颜色”的码的值是“绿色”
我用下面的底座标准:
Criteria criteria = currentSession()
.createCriteria(Code.class, "code")
.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
当我尝试执行收集过滤器(如建议here):
criteria.createAlias("code.properties", "p");
criteria.add(Restrictions.eq("p.foo", "test1"));
criteria.setFetchMode("code.properties", FetchMode.JOIN);
criteria.list();
我得到以下错误:
org.hibernate.QueryException: could not resolve property: foo of: com.example.CodeValue
这意味着,我真的不明白为什么,Hibernate是考虑到code.properties是地图的CodeValue代替!
我也尝试访问这个字段而不创建别名,并且这种方式冬眠似乎访问了正确的代码类。我用properties.indeces(如建议here):
criteria.add(Restrictions.eq("properties.indeces", "foo"));
criteria.list();
但有了这个,我得到了以下错误:
could not resolve property: properties.indeces of: com.example.Code
有人可以帮助我了解什么是错?正确的标准查询将以绿色找到代码是什么?您可以结帐the Github project that demonstrates this problem。
感谢
我注意到你正在使用@MapKeyClass的JPA 2.1特性。您是否一定会使用弃用的Hibernate Criteria API而不是JPA Criteria API? – Naros
@Naros代表micdcar回答 - 是的,不幸的是,这意味着将整个sessionfactory配置切换到entitymanager,这可以被探索,但不会在如此短的时间内发布。因此,我们必须创建标准,它返回一个休眠条件。 – mmalmeida