选择集合不会导致JPA 2中的异常

时间:2012-05-31 07:30:29

标签: orm jpa-2.0 eclipselink

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

  

选择查询的结果类型不能是集合;它必须是一个   单值对象,例如实体实例或持久字段   类型。 SELECT子句中的电子表达式等表达式是非法的   因为它们会导致Collection实例(每次出现   电子电话是一个集合,而不是一个实例)。因此,就像   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

2 个答案:

答案 0 :(得分:2)

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

与查询相同,

select p from Employee e join e.phones p where e.id = 1

答案 1 :(得分:0)

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

select e.phones from Employee e, Object.class

我想要提出的观点可能是你的结果,因为emp id 1只包含一个手机对象。