我在Person
实体中的一个字段被建模为地图。
@Entity
public class Person{
@OneToMany
@MapKeyEnumerated(EnumType.STRING)
public Map<PhoneType, PhoneNumber> phones;
PhoneType
是一个枚举,PhoneNumber
是一个实体。根据我对标准API的理解,以下代码应该起作用:
public List<Object> getPersonPhonesCriteria(){
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Object> cq = cb.createQuery();
Root<Person> person = cq.from(Person.class);
MapJoin<Person,PhoneType,PhoneNumber> phones = person.joinMap("phones");
cq.multiselect(person.get("firstName"), phones.key(), phones.value());
TypedQuery<Object> q = em.createQuery(cq);
return q.getResultList();
}
但是我收到以下错误:
ERROR 6160 --- [main] o.h.hql.internal.ast.ErrorCounter : node did not reference a map
antlr.SemanticException: node did not reference a map
at org.hibernate.hql.internal.ast.HqlSqlWalker.validateMapPropertyExpression(HqlSqlWalker.java:1336) ~[hibernate-core-4.3.11.Final.jar:4.3.11.Final]
key()
中的value()
和multiselect
方法的反向调用顺序突然有效:
cq.multiselect(person.get("firstName"), phones.value(), phones.key());
这几乎让我疯狂。任何人都可以解释为什么multiselect
在一种情况下有效而在另一种情况下无效吗?