我在阅读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
答案 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只包含一个手机对象。