Orm 选择集合不会导致JPA2中出现异常

Orm 选择集合不会导致JPA2中出现异常,orm,jpa-2.0,eclipselink,Orm,Jpa 2.0,Eclipselink,我在理解Pro JPA 2一书中的这一行代码时有点困难 根据181页的书 select查询的结果类型不能是集合;这一定是一场灾难 单值对象,如实体实例或持久字段 类型。在SELECT子句中,诸如e.phones之类的表达式是非法的 因为它们会导致集合实例(每次 e、 手机是一个集合,而不是一个实例)。因此,正如 SQL和表,如果我们想沿着集合关联导航 并返回该集合的元素,我们必须将这两个实体连接起来 一起 请用关系映射考虑下面的实体 @Entity public class Employee {

我在理解Pro JPA 2一书中的这一行代码时有点困难 根据181页的书

select查询的结果类型不能是集合;这一定是一场灾难 单值对象,如实体实例或持久字段 类型。在SELECT子句中,诸如e.phones之类的表达式是非法的 因为它们会导致集合实例(每次 e、 手机是一个集合,而不是一个实例)。因此,正如 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;
    ..
}
@实体
公营雇员{
..
@OneToMany(mappedBy=“employee”,cascade=CascadeType.ALL,targetEntity=Phone.class)
私人收集电话=新建ArrayList();
..
}
@实体
公用电话{
..
@奥内托内
私人雇员;
..
}
现在在一个测试类中,我用这个测试用例进行了测试

@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);
    }
}
@测试
public void selectCollectionTest(){
TypedQuery query=em.createQuery(“从员工e中选择e.phones,其中e.id=1”,Object.class);
List empList=query.getResultList();
用于(对象温度:雇员列表){
系统输出打印项次(温度);
}
}
我原以为会抛出异常,但什么也没有发生,我能够选择集合

这是正确的吗?有人能解释或澄清我的理解吗


Eclipselink

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

select e.phones from Employee e, Object.class

我想说的一点可能是,您的emp id 1只包含一个phone对象。

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

这与查询相同

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

您可以尝试启用发送到数据库的查询的日志记录,可以参考Yes这似乎是这样。。。但作为JPA的新手,我只是想知道为什么Eclipselink会这样做?作为JPA的参考实现,我实际上认为它应该遵循规则。或者我可能错了,因为我只是在遵循专业JPA2书籍。正确的方法应该是使用联接?是这样吗?