Использование LOWER() и UPPER() в Glassfish EJB QL

Я перевожу проект EJB 2.0 из Websphere в Glassfish. Большинство запросов находятся в файле ejb-jar.xml в EJB QL, который почти, но не совсем, полностью отличается от SQL.

Однако существует проблема с некоторыми запросами, которые содержат UPPER() и LOWER(), например:

    <query>
        <description></description>
        <query-method>
            <method-name>findByPersonUserId</method-name>
            <method-params>
                <method-param>java.lang.String</method-param>
            </method-params>
        </query-method>
        <ejb-ql>select object(o) from Person o where o.personUserId = lower(?1)</ejb-ql>
    </query>

Исследования показали, что LOWER () и UPPER() не были указаны в спецификации EJB 2.0. Websphere пошел дальше и использовал расширение EJB QL, которое включало LOWER () и UPPER(), так что все это работало нормально, а Glassfish - нет, и это означает, что я получаю следующую ошибку при запуске:

Вызвано: java.lang.RuntimeException: JDO74025: JDOCodeGenerator: Обнаружено исключение, проверяющее bean-компонент CMP "Person" в модуле "MyPackage" приложения "MyPackageEJB": JDO75006: Неверный запрос EJBQL
Бин: Персона
Метод: mypackage.entity.PersonLocal findByPersonUserId (java.lang.String)
EJBQL: выберите объект (o) из Person o, где o.personUserId = lower(?1)
Ошибка: столбец (60): JDO75202: Синтаксическая ошибка: неожиданный токен '('.

Однако дальнейшие исследования показали, что в EJB 3.0 действительно есть LOWER () и UPPER() как часть стандарта, и поэтому они должны работать. Однако я не могу этого сделать; что бы я ни делал, я всегда получаю одну и ту же ошибку.

Это делается в Eclipse.

То, что я сделал до сих пор:
1. Я внес изменения в текст запроса и увидел обновленную версию в журналах Glassfish. Таким образом, я знаю, что EAR генерируется и развертывается правильно - не нужно постоянно пытаться развернуть один и тот же сломанный EAR.
2. Я обновил объявление ejb-jar.xml с 2.0 до 3.1:

Старый: <ejb-jar id="ejb-jar_ID" version="2.1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">
Новое: <ejb-jar id="ejb-jar_ID" version="3.1" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd">

  1. В Eclipse, в свойствах проекта -> Фасеты проекта, я обновил версию модуля EJB с 2.1 до 3.2. Я также включил фасет JPA (не установлен ранее, так как, я думаю, Websphere не нуждался в этом?) И установил его на 2.1.
  2. В свойствах проекта ->JPA я изменил платформу с Generic 2.1 на EclipseLink 2.5.x[1] и изменил реализацию с системной библиотеки Glassfish на пользовательскую библиотеку EclipseLink 2.5.2.
  3. Я заметил, что хотя при включении фасета JPA был создан файл persistence.xml, которого раньше не было, это был только пустой элемент единицы постоянства. Изменения на странице свойств JPA никогда не вносили никаких изменений в этот файл, даже когда я менял информацию о поставщике или подключении к базе данных. Добавление в <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> не вызывает каких-либо изменений в поведении.

Но ошибка не ослабевает. Похоже, что ни одна из настроек на самом деле не повлияла на то, какой поставщик используется для проверки запросов EJB QL.

Итак, вопросы.

  1. Прав ли я, предполагая, что LOWER()/UPPER() должен работать в EJB 3.0 (альтернативно, есть ли какой-нибудь провайдер EJB 2, который я мог бы использовать на Glassfish, который бы его поддерживал)?
  2. Прав ли я, предполагая, что файл ejb-jar.xml не должен требовать изменения, кроме изменения объявления версии в верхней части?
  3. Я упускаю что-то поразительно очевидное с точки зрения того, чтобы сообщить Glassfish, на каком уровне EJB должен быть проверен / запущен EAR, или какого поставщика JPA он должен использовать?

[1] Я вижу, что есть версия 2.7 для EclipseLink. Я не знаю, почему Eclipse не предлагает его мне в качестве опции (с использованием Java 8, работает Eclipse Oxygen), но если это не станет ключом к решению моей проблемы, мне на самом деле все равно.

0 ответов

Другие вопросы по тегам