Это действительный EJB-QL? - PullRequest
       48

Это действительный EJB-QL?

2 голосов
/ 22 апреля 2010

У меня есть следующая конструкция в EJB-QL, несколько методов поиска EJB 2.1:

SELECT distinct OBJECT(rd) FROM RequestDetail rd, DetailResponse dr 
      WHERE dr.updateReqResponseParentID is not null 
      and dr.updateReqResponseParentID = ?1 
      and rd.requestDetailID = dr.requestDetailID
      and rd.deleted is null and dr.deleted is null

Проверка IDEA EJB-QL помечает использование двух объектов FROM RequestDetail rd, DetailResponse dr с проверкой, которая гласит: Several ranged variable declarations are not supported, use collection member declarations instead (e.g. IN(o.lineItems))

Сами запросы работают нормально (как и в случае ожидаемых результатов) в JBoss 4.2. У нас все IDEA мокро, или есть допустимая проблема с запросом? И какой фактический предпочтительный альтернативный синтаксис для такого запроса?

Редактировать: Спасибо за помощь всем, кто ответил, особенно Ромен. Я сообщил об этом как проблема в JetBrains.

Ответы [ 3 ]

2 голосов
/ 02 мая 2010

Запрос в порядке - похоже на проблему IDEA Code Inspector.
Я не могу найти никаких ошибок, зарегистрированных против него как такового.

Возможно, вы захотите обратиться в службу поддержки, если у вас есть платная версия.

Я обнаружил небольшую проблему в спецификации EJB 2.1 (и во всех остальных случаях), где говорится, что для NULL нужно использовать верхний регистр.

11.2.6.10 Нулевые выражения сравнения
Синтаксис использования оператора сравнения IS NULL в условном выражении выглядит следующим образом: {single_valued_path_expression | input_parameter} IS [NOT] NULL Нулевое выражение сравнения проверяет, является ли однозначное выражение пути или входной параметр значением NULL.

SELECT distinct OBJECT(rd) FROM RequestDetail rd, DetailResponse dr 
      WHERE dr.updateReqResponseParentID IS NOT NULL 
      and dr.updateReqResponseParentID = ?1 
      and rd.requestDetailID = dr.requestDetailID
      and rd.deleted IS NULL and dr.deleted IS NULL

Вот раздел из спецификации EJB 2.1, который соответствует вашим запросам ...

11.2.5.3 Объявления переменных диапазона Синтаксис EJB QL для объявления идентификационной переменной в качестве переменной диапазона аналогичен синтаксису SQL; необязательно, он использует ключевое слово AS.

range_variable_declaration :: = abstract_schema_name [AS] identifier Объекты или значения, которые относятся к бину сущности, обычно получают навигацией с использованием выражений пути. Однако навигация не достигает всех объектов. Объявления переменных диапазона позволяют Бину Поставщик назначает «корень» для объектов, которые могут быть недоступны при навигации. Если поставщик бина хочет выбрать значения, сравнивая более одного экземпляра типа абстрактной схемы бина сущности, в предложении FROM требуется более одной идентификационной переменной, варьирующейся по типу абстрактной схемы.

Следующий запрос метода поиска возвращает заказы, количество которых превышает количество заказов для Джона Смита. Этот пример иллюстрирует использование двух разных переменных идентификации в предложении FROM, оба типа абстрактной схемы Order. Предложение SELECT этого запроса определяет, что возвращаются заказы с количествами, большими, чем у Джона Смита.

SELECT DISTINCT OBJECT(o1)
FROM Order o1, Order o2
WHERE o1.quantity > o2.quantity AND
o2.customer.lastname = ‘Smith’ AND
o2.customer.firstname= ‘John’
1 голос
/ 01 мая 2010

Предполагая, что detailResponse является именем поля ассоциации, значением которого является коллекция экземпляров DetailResponse, вы можете сделать это для навигации по полям ассоциации:

  SELECT distinct OBJECT(rd) FROM RequestDetail rd IN (rd.detailResponse) dr WHERE
  dr.updateReqResponseParentID is not null and dr.updateReqResponseParentID = ?1 
  and rd.deleted id null and dr.deleted is null
0 голосов
/ 01 мая 2010

Я бы сравнил запросы с официальным ресурсом, таким как Грамматика BNF EJB QL для J2EE 1.3 (поскольку вы упомянули EJB2.1)

Для более новой спецификации для JEE5 Полный синтаксис языка запросов

...