我正在将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">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
不会导致行为上的任何改变。但是错误仍然存在。在使用提供程序验证EJB QL查询方面,任何设置似乎都没有产生任何实际影响。
所以,问题。
[1]我看到EclipseLink有一个2.7版本。我不知道为什么Eclipse不作为选项提供给我(使用Java 8,运行Eclipse Oxygen),但是除非它成为解决我的问题的关键,否则我实际上不在乎。