Я использую 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», и затем вывести свойство изобъекта сущности.Однако я бы хотел, чтобы это работало так, как я ожидаю, без этого.