Java JPA和JPQL:NoResultException当从一个值为null的多个表中进行选择时

Java JPA和JPQL:NoResultException当从一个值为null的多个表中进行选择时,java,jakarta-ee,jpa,jpql,entitymanager,Java,Jakarta Ee,Jpa,Jpql,Entitymanager,我正在使用JavaEE6,并使用JPA的javax.persistence.Entitymanager查询数据库。我有一个JPQL查询代码片段,看起来像这样: 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

我正在使用JavaEE6,并使用JPA的javax.persistence.Entitymanager查询数据库。我有一个JPQL查询代码片段,看起来像这样:

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为null(非必需)

我希望它执行并返回一个Object[]数组,其中前两个元素(propertyX和propertyY)的值为空,第三个元素(propertyZ)的值为空

但是,当propertyZ为null时,将引发NoResultException。如果更改数据使propertyZ不为null,则执行查询并返回一个值

  • 这是预期的JPQL行为吗
  • 如何确保查询的行为符合我最初的预期

显而易见的解决方法是选择整个根实体而不是任何子属性,例如“C”而不是“C.propertyZ”,然后从实体对象中获取属性。但是,我希望它能像我期望的那样工作,而不这样做。

如果对于a和B中的给定行,C中有一行C.type=B.type,但该行的propertyZ列为null,那么您的查询应该返回一条记录是正确的

但是,如果对于A和B中的给定行,C中没有匹配的行,其中C.type=B.type,那么您的查询将不会返回任何结果。这与JPQL无关,而是与SQL有关

如果希望后一种情况在propertyZ字段中仍然返回一个null的记录,则需要使用外部联接


HTH

如果对于a和B中的给定行,C中有一行C.type=B.type,但该行的propertyZ列为null,那么您的查询应该返回一条记录,这是正确的

但是,如果对于A和B中的给定行,C中没有匹配的行,其中C.type=B.type,那么您的查询将不会返回任何结果。这与JPQL无关,而是与SQL有关

如果希望后一种情况在propertyZ字段中仍然返回一个null的记录,则需要使用外部联接


HTH

正如我在问题中所写:所有三个表都有匹配的行。但是如果C.propertyZ为null,则查询失败。如果C.propertyZ不为null,则查询将成功返回某些内容。其他一切都是一样的。并且C.propertyZ未在任何查询条件中使用。不确定是什么导致它。。实际SQL查询与此简化版本有多大不同?你能分享实际的查询吗?我的实际查询与这里使用的查询非常相似。我甚至修改了它,使它看起来和这里的一样,并得到了相同的结果。正如我在问题中所写的:所有三个表都有匹配的行。但是如果C.propertyZ为null,则查询失败。如果C.propertyZ不为null,则查询将成功返回某些内容。其他一切都是一样的。并且C.propertyZ未在任何查询条件中使用。不确定是什么导致它。。实际SQL查询与此简化版本有多大不同?你能分享实际的查询吗?我的实际查询与这里使用的查询非常相似。我甚至修改了它,使它看起来和这里的一样,得到了相同的结果。