Я использую Java EE 6 и запрашиваю базу данных с помощью 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) и null для третьего элемента (propertyZ).
Однако, когда свойствоZ имеет значение null, создается исключение NoResultException. Если я изменяю данные так, что свойство Z не равно нулю, запрос выполняется и возвращает значение.
- Это ожидаемое поведение JPQL?
- Как я могу гарантировать, что мой запрос будет вести себя так, как я ожидал?
Очевидный обходной путь - выбрать всю корневую сущность, а не любое подсвойство, например 'C', а не 'C.propertyZ', а затем получить свойство из объекта сущности. Однако я бы хотел, чтобы это работало так, как я ожидал, без этого.