使用MapJoin接口

时间:2015-12-30 10:57:06

标签: hibernate jpa dictionary one-to-many criteria-api

我在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在一种情况下有效而在另一种情况下无效吗?

0 个答案:

没有答案