Java:名前が付けられた文字列の問題
-
29-09-2019 - |
質問
こんにちはみんな私は名前の名前を付けている間、正確な一致にいくつかの問題を抱えています。
私は現在、このようなものを使用しています:
@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());
ほとんどの場合は機能しますが、ユーザーが最後にスペースを持ってファイル名を渡すと、名前の付いた人はそのキャラクターを無視していることに気付きました。例えば:
Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
query.setParameter(Entry.NAME, myEntry.getName()+ " ");
以前のクエリと同じ結果を返します。 「有効なエントリ」検証をバイパスします。言い換えれば、クエリにエントリをまったく返さず、後でエラーを扱いたいと思います。
私が考えることができた1つの回避策は、このように、名前付きクエリに私のパラメーターを囲む単一の引用符を置くことです。
@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")
ただし、文字列に単一の引用符が含まれている場合に備えて、コードをゴミ箱に捨てます...
アイデアの人はいますか?
解決 2
私はJPAでいくつかの研究を行い、それが文字のためにいくつかの自動トリミングを行うことを発見しました、私はこれが文字列で同じように振る舞うかどうかはわかりませんが、それが私に起こっているので...私はそう信じています。それをバイパスする唯一の方法は、セッション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
}
また、トリム関数axtavtを含める必要がありました!これは、データベースにトレーリングスペースのある列があり、ユーザーが指定したパラメーターと一致する場合、有効な答えとして含まれることを確認するためです。例えば:
データベースエントリ:name = "flavio" - function = "flavio"でトリミング。
パラメーターの合格:name = "flavio" -JPA Automatic Function = "Flavio"によってトリミングされました。
トリミングされていない場合は、「フラビオ」と「フラビオ」を比較するだけで、そのエントリを返すことになったときにノースルトを返します。
厄介な回避策ですが、自動トリミングを停止する他の方法がない限り、この種のことを利用する必要があります。
他のすべての答えをありがとう!
他のヒント
あなたのデータベースフィールドがとして宣言されているため、これは起こると思います CHAR(...)
, 、したがって、保存された値は、によって考慮されていない空白でパッド入ります =
手術。
したがって、データベースフィールドを次のように宣言することもできます VARCHAR(...)
または組み込みを使用します trim
働き:
query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME