2

これは非常に単純に見えますが、自分で解決策を見つけられなかったとは信じられません。名前を持つ PersonBean という名前の Bean があります。ここで、文字列を受け取り、名前にその文字列が含まれている人を、大文字と小文字を区別せずに検索するファインダー メソッドを作成したいと思います。これが私の現在の EJB QL です。

SELECT OBJECT(p)
FROM Person p
WHERE (p.name LIKE ?1)

これには2つの問題があります:

  1. 検索で大文字と小文字を区別しないようにしたいのですが (上記では大文字と小文字が区別されます) 、EJB QL でlower()またはのようなものが見つかりません。upper()その振る舞いをするために私は何ができますか?更新: 私は J2EE バージョン 1.4 と glassfish バージョン 2.1 を使用しています。
  2. メソッドに醜い文字列を渡す必要がありますfindByString("%john%")。次のようなものを渡すことができるように、EJB QL を作成する方法はありfindByString("john")ますか?
4

2 に答える 2

2

EJB 2.x エンティティ Bean で使用される EJB-QL (JPA および EJB3 エンティティ Bean で使用される JPQL と混同しないでください) は非常に制限されています。EJB 2.1 の言語にはいくつかの追加がありましたが、私の考えでは上位/下位の機能はありません。

どのコンテナで実行されているかはわかりませんが、JBoss は EJB-QL (JBossQL と呼ばれる) にいくつかの拡張を行い、UCASE機能を備えています。

于 2010-08-04T11:43:15.170 に答える
1

2 番目の質問については、CONCATEJB QL 2.1 に関数があるため、次のようにするとよいと思います。

WHERE (p.name LIKE CONCAT('%', CONCAT(?1, '%')))

編集: ql grammer は式でリテラル文字列と入力パラメーターのみを許可するため、上記は機能しませんLIKE。これは実際には制限されています。LOCATE次のような関数を使用して、同じ効果を達成できるはずです。

WHERE LOCATE(p.name, ?1) <> 0
于 2010-08-04T12:01:19.243 に答える