2011-10-28 3 views
0

私はAddressのようなエンティティを持っています。パフォーマンスの問題のため、私はエンティティ全体を "street; zip; city"のような単一のフィールドに保存したい。Hibernateで文字列の類似情報を保存するためのEnhancedUserTypeの記述、SQLインジェクションの回避

EnhancedUserTypeを作成してこれを行うことができます。私が見つけたいくつかの例ではと方法「objectToSQLStringを」休止状態のソースに、常にそのように実装されています。メソッドはSQL表現を返すかどう私は、理解していない

@Override 
public String objectToSQLString(Object object) { 
    if (object != null) { 
     Address oo = (Address)object; 
     return "'" + oo.toSomeString() + "'"; 
    } else { 
     return ""; 
    }  
} 

。 [']のような特殊記号が文字列の中でエスケープされないのはなぜですか?どのように私はそれらを逃れるべきですか?標準的なSQL方法は['] - > [' ']ですが、いくつかの方言では[バックスラッシュ]もエスケープする必要があります。

私はdialectに依存してエスケープすることができるいくつかのHibernateユーティリティはありますか? Hibernate自体はこの問題をどのように解決しますか?私はソースコードでそれを見つけることができませんでした:-(

+0

[コンポーネントマッピング](http://docs.jboss.org/hibernate/core/3.3/reference/en/html/components.html)? – millimoose

+0

JDBCプリペアドステートメントだけでは使えない理由は何ですか? – ChadNC

+0

私はいつもPrepared Statementを使いますが、Hibernateはこのメソッドを含むEnhancedUserTypeを実装したいと思っています。 – 30thh

答えて

1

実際には、単一引用符で囲まれ、内部スコープがエスケープされたSQLリテラル文字列を返す必要があります。AFAIK、単一引用符のみをエスケープする必要があります。'O''Reilly'

しかし、私はあなたがこのような全体のアドレスを1つの列に入れて何かを得ることは疑いの余地があります。そして、あなたは個人的な質問をする可能性を失います。これらの3つのフィールドがパフォーマンス上の問題を引き起こしたことを測定しましたか?それらを1つの列に入れると問題は解決しますか?

+0

私たちは、このような小さな依存オブジェクトをたくさん持ち、それらのすべてを熱心に読み込む必要があります(SOAPを介して転送するためです)。 – 30thh

+0

これは、同じテーブル内であっても、これらの埋め込みオブジェクトをデータベースの複数の列に格納することを妨げません。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-component –

+0

を参照してください。一重引用符は問題ありません。この問題は、エスケープにも使用できるMySQL表記のバックスラッシュです。私は、Hibernateがそれをどのように処理するのか興味がありますか? – 30thh

関連する問題