【发布时间】:2011-12-21 11:07:48
【问题描述】:
我正在使用 Java EE 6 并使用 JPA 的 javax.persistence.Entitymanager 查询数据库。我有一个 JPQL 查询代码 sn-p,看起来像这样:
Query query = entityManager.createQuery("
select A.propertyX, B.propertyY, C.propertyZ
from TableA A, TableB B, TableC C
where A.id = :id and B.id = A.id and C.type = B.type
");
query.setParameter("id", id);
Object[] result = (Object[]) query.getSingleResult();
propertyX/Y/X 都是对其他实体的引用。在我的例子中,TableA、TableB 和 TableC 中的匹配行都存在。对于匹配的行,TableA.propertyX 和 TableB.propertyY 保存值,而 TableC.propertyZ 为空(并且不是必需的)。
我希望它执行并返回一个 Object[] 数组,其中前两个元素(propertyX 和 propertyY)的值和第三个元素(propertyZ)的值为 null。
但是,当 propertyZ 为 null 时,会抛出 NoResultException。如果我更改数据以使 propertyZ 不为空,则查询将执行并返回一个值。
- 这是预期的 JPQL 行为吗?
- 如何确保查询的行为符合我最初的预期?
显而易见的解决方法是选择整个根实体而不是任何子属性,例如'C' 而不是 'C.propertyZ',然后从实体对象中获取属性。但是,我希望它能够按我的预期工作,而无需这样做。
【问题讨论】:
标签: java jakarta-ee jpa jpql entitymanager