Использование LOWER () и UPPER () в Glassfish EJB QL - PullRequest
0 голосов
/ 22 февраля 2019

Я перевожу проект 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
Bean: Person
Метод mypackage.entity.PersonLocal findByPersonUserId (java.lang.String)
EJBQL: выбрать объект (o) из Person o, где o.personUserId = нижний (? 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">

В Eclipse, в свойствах проекта -> Фасеты проекта, я обновил версию модуля EJB с 2.1 до 3.2.Я также включил фасет JPA (не установлен ранее, так как, я думаю, Websphere не нуждался в этом?) И установил его на 2.1. В свойствах проекта -> JPA я изменил платформу с Generic 2.1 на EclipseLink 2.5.x [1] и изменил реализацию с системной библиотеки Glassfish на пользовательскую библиотеку EclipseLink 2.5.2. Я заметил, что, хотя включение фасета 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), но если это не станет ключом к решению моей проблемы, мне на самом деле все равно.

...