JPA и JPQL: NoResultException при выборе из нескольких таблиц, в которых одно значение равно нулю - PullRequest
2 голосов
/ 03 ноября 2011

Я использую Java EE 6 и запрашиваю базу данных, используя javax.persistence.Entitymanager от JPA.У меня есть фрагмент кода запроса 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) и null для третьего элемента (propertyZ).

Однако, когда propertyZ имеет значение null, возникает исключение NoResultException.Если я изменю данные так, чтобы свойство Z не было нулевым, запрос выполняется и возвращает значение.

  • Это ожидаемое поведение JPQL?
  • Как я могу убедиться, что мой запрос будет работатькак я и ожидал?

Очевидный обходной путь - выбрать всю корневую сущность, а не любое подсвойство, например, «C», а не «C.propertyZ», и затем вывести свойство изобъекта сущности.Однако я бы хотел, чтобы это работало так, как я ожидаю, без этого.

1 Ответ

0 голосов
/ 03 ноября 2011

Если для заданной строки в A и B есть строка в C, где C.type = B.type, но столбец propertyZ для этой строки равен нулю, то вы правы, что ваш запрос должен вернуть запись.

Однако, если для данной строки в A и B нет соответствующей строки в C, где C.type = B.type, ваш запрос не вернет результата.Это не имеет ничего общего с JPQL, но с SQL

Если вы хотите, чтобы последний случай все еще возвращал запись с нулевым значением в поле propertyZ, вам нужно использовать OUTER JOINs

HTH

...