0

根据第 181 页的书,我在理解 Pro JPA 2 书中的这行代码时遇到了一些麻烦。

选择查询的结果类型不能是集合;它必须是单值对象,例如实体实例或持久字段类型。诸如 e.phones 之类的表达式在 SELECT 子句中是非法的,因为它们会导致 Collection 实例(每次出现的 e.phones 都是一个集合,而不是一个实例)。因此,就像 SQL 和表一样,如果我们想沿着集合关联导航并返回该集合的元素,我们必须将两个实体连接在一起。

请考虑以下实体与关系映射

@Entity
public class Employee {
    ..
    @OneToMany(mappedBy="employee", cascade=CascadeType.ALL, targetEntity=Phone.class)
    private Collection<Phone> phones = new ArrayList<Phone>();
    ..
}
@Entity
public class Phone {
    ..
    @OneToOne 
    private Employee employee;
    ..
}

现在在一个测试类中,我用这个测试用例进行了尝试

@Test
public void selectCollectionTest(){
    TypedQuery<Object> query = em.createQuery("select e.phones from Employee e where e.id = 1", Object.class);  
    List<Object> empList = query.getResultList();
    for(Object temp: empList){
        System.out.println(temp);
    }
}

我期待会引发异常,但什么都没有发生,我能够选择集合?

它是否正确?有人可以解释或清除我的理解吗?

Eclipselink

4

2 回答 2

2

EclipseLink 允许这样做,它是一个扩展,JPA 规范不支持它。

和查询一样,

select p from Employee e join e.phones p where e.id = 1
于 2012-05-31T13:38:22.237 回答
0

尝试通过删除 where 子句使用以下代码运行您的查询:

select e.phones from Employee e, Object.class

我要说明的一点可能是您对emp id 1 的结果仅包含单个电话对象。

于 2012-05-31T12:35:53.523 回答