在Glassfish EJB QL中使用LOWER()和UPPER()

时间:2019-02-22 09:52:28

标签: jpa glassfish ejb ejbql

我正在将EJB 2.0项目从Websphere迁移到Glassfish。大部分查询都在EJB QL的ejb-jar.xml文件中,该文件几乎但不是完全不同于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>

研究告诉我EJB 2.0规范中未指定LOWER()和UPPER()。 Websphere继续使用包含LOWER()和UPPER()的EJB QL扩展,因此一切正常,但是Glassfish却不行,这意味着启动时出现以下错误:

  

由以下原因引起:java.lang.RuntimeException:JDO74025:JDOCodeGenerator:在应用程序“ MyPackage”模块“ MyPackageEJB”中捕获了验证CMP bean“ Person”的异常:JDO75006:无效的EJBQL查询
  Bean:人物
  方法:mypackage.entity.PersonLocal findByPersonUserId(java.lang.String)
  EJBQL:从人员o中选择对象(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">

  1. 在Eclipse中,在项目的Properties-> Project Facets下,我将EJB Module的版本从2.1升级到了3.2。我还打开了JPA构面(以前未设置,因为我想Websphere不需要它了?)并将其设置为2.1。
  2. 在项目的Properties-> JPA下,我已将平台从通用2.1更改为EclipseLink 2.5.x [1],并将实现从Glassfish系统库更改为EclipseLink 2.5.2用户库。
  3. 我注意到,尽管启用JPA构面会创建一个persistence.xml文件,该文件以前不存在,但它只是一个空的persistence-unit元素。即使更改了提供程序或数据库连接信息,“ JPA属性”页面上的更改也从未对此文件进行任何更改。添加<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>不会导致行为上的任何改变。

但是错误仍然存​​在。在使用提供程序验证EJB QL查询方面,任何设置似乎都没有产生任何实际影响。

所以,问题。

  1. 我是否正确假设LOWER()/ UPPER()应该在EJB 3.0中工作(或者,我可以在Glassfish上使用某些EJB 2提供程序来支持它)吗?
  2. 我是否认为ejb-jar.xml文件除了修改顶部的版本声明外不需要进行其他更改?
  3. 在告诉Glassfish应该验证/运行EAR的EJB级别是什么,还是应该使用哪个JPA提供程序方面,我是否遗漏了一些非常明显的东西?

[1]我看到EclipseLink有一个2.7版本。我不知道为什么Eclipse不作为选项提供给我(使用Java 8,运行Eclipse Oxygen),但是除非它成为解决我的问题的关键,否则我实际上不在乎。

0 个答案:

没有答案