为什么这个EJBQL查询不是由JBoss 5验证的?

时间:2010-08-09 05:54:55

标签: java jboss weblogic ejbql

我正在将现有的应用程序从Weblogic服务器9迁移到JBoss 5.

我的问题是在WHERE子句中有一个字符条件的查询,如下所示:

SELECT DISTINCT OBJECT(myObject) 
FROM MyObject myObject 
WHERE myObject.myAttribute = 'F'

...我认为与WLS合作现在会导致JBoss中止部署,原因如下:

Caused by: org.jboss.ejb.plugins.cmp.ejbql.ParseException: Encountered "\'F\'" 
at line 1, column 99.
Was expecting one of:
    "ABS" ...
    "LENGTH" ...
    "LOCATE" ...
    "SQRT" ...
    "MOD" ...
    "(" ...
    "+" ...
    "-" ...
    <INTEGER_LITERAL> ...
    <FLOATING_POINT_LITERAL> ...
    <NUMERIC_VALUED_PARAMETER> ...
    <NUMERIC_VALUED_PATH> ...

ejb-jar.xml和jbosscmp-jdbc.xml文件声明了类型和属性。在Java文件中,此属性的getter和setter方法都使用java.lang.Character类型。 Oracle数据库列的类型为CHAR(1)。

在jbosscmp-jdbc.xml文件中声明的Query编译器是

org.jboss.ejb.plugins.cmp.jdbc.EJBQLToSQL92Compiler

此编译器应与EJBQL 2.1查询一起使用。将编译器更改为默认的JDBCEJBQLCompiler不会改变任何内容。

有人知道这里有什么问题吗?

感谢您的帮助! : - )

1 个答案:

答案 0 :(得分:1)

EJBQL只知道WHERE子句中的String,Integer和Boolean-Literals。 'F'是一个String,查询期望一个smallint值,因为我猜,char被映射到一些整数值。

编辑:也许使用'F'的文字ascii-code 70可以用于此查询。 然而: SQL CHAR数据类型不应用于映射到cmp字段的数据库列。 也许把它改成varchar。