6

こんにちは皆さん、NamedQueryを実行しているときに、完全一致で問題が発生しています。

私は現在次のようなものを使用しています:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME )

...

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName());

ほとんどの場合は機能しますが、ユーザーがファイル名の最後にスペースを付けて渡す場合、namedQueryはその文字を無視することに気付きました。例えば:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName()+ " ");

以前のクエリと同じ結果を返します。「有効なエントリ」の検証をバイパスします。つまり、クエリがエントリをまったく返さず、後でエラーを処理するようにしたいのです。

私が考えることができる1つの回避策は、次のように、namedQueryのパラメーターを一重引用符で囲むことです。

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")

ただし、文字列に一重引用符が含まれている場合は、コードが破棄されます...

アイデアはありますか?

4

2 に答える 2

4

これは、データベースフィールドがとして宣言されているために発生すると思います。CHAR(...)したがって、格納されている値には、操作で考慮されない空白が埋め込まれます=

したがって、データベースフィールドを次のように宣言するかVARCHAR(...)、組み込みtrim関数を使用することができます。

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
于 2010-08-16T15:26:45.367 に答える
4

JPAで調査したところ、CHARの自動トリミングが行われていることがわかりました。これが文字列でも同じように動作するかどうかはわかりませんが、私に起こっているので...そう思います。これをバイパスする唯一の方法は、セッションDatabaseLoginオブジェクト内に属性を設定することです(http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/DatabaseLogin.html#setShouldTrimStringsを参照)。

さて、私はセッションプロパティを台無しにしたくなかったので、ある種のチェックを行い、コードでNoResultExceptionキャッチが行うのと同じ例外をスローすることにしました。

基本的にデータベースから結果を取得し、フィールドを使用した文字列と比較しました。

query.setParameter(Entry.NAME, myEntry.getName());

...

if(!StringUtils.equals(result.getName(), myEntry.getName()){
   do a cool throw just like NoResultException Catch
}

Trim関数axtavtも含める必要がありました!これは、データベースに末尾にスペースがある列があり、それがユーザーによって指定されたパラメーターと一致する場合、それが有効な回答として含まれることを確認するためだけのものです。例えば:

データベースエントリ:Name ="Flavio"-Function="Flavio"でトリミングされています。

渡されたパラメーター:Name="Flavio"-JPA自動関数でトリミング="Flavio"。

まったくトリミングされていない場合は、「Flavio」と「Flavio」を比較するだけで、そのエントリを返すはずのときにNoResultが返されます。

厄介な回避策ですが、自動トリミングを停止する他の方法がない限り、この種のものを使用する必要があります。

他のすべての答えをありがとう!

于 2010-08-16T19:05:16.967 に答える