1

既存のアプリケーションを 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 ファイルで宣言されているクエリコンパイラは

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

このコンパイラは、EJBQL 2.1 クエリで使用する必要があるコンパイラです。コンパイラをデフォルトの JDBCEJBQLCompiler に変更しても、何も変わりません。

ここで何が問題なのか知っている人はいますか?

ご協力いただきありがとうございます!:-)

4

1 に答える 1

1

EJBQL は、WHERE 句の String、Integer、および Boolean-Literals のみを認識します。「F」は文字列であり、クエリは smallint 値を期待しています。これは、char がいくつかの整数値にマップされているためです。

編集:おそらく、このクエリには「F」のリテラルASCIIコード70を使用できます。ただし、SQL CHAR データ型は、cmp フィールドにマップされるデータベース列には使用しないでください。おそらくvarcharに変更してください。

于 2010-08-09T08:42:55.560 に答える