2011-11-28 5 views
1

URLを格納するデータベーステーブルがあります(http://google.comなど)。テーブルに対応するエンティティがURLタイプフィールドを持っているので、私は次のような基準クエリを作成します。java.net.URL型オブジェクトの条件クエリを実行する可能性と制限

CriteriaBuilder cb = ... 
Path<URL> path = ... 
cb.equal(path , new URL("http://google.com")); 

意図したとおり、この作品、しかし、私はこのような何かを行うことができるようにしたい:

cb.like(path.<String>get("externalForm"), "%google%"); 

は明らかURLはexternalFormフィールドを持っていないが、代わりにtoExternalForm()メソッドを持っています。

この種類のクエリはAPIで可能ですか?はいの場合:どのように?または、URL列をURLではなく文字列にマップするのが最善でしょうか?

答えて

2

いいえ、条件クエリで永続値のメソッドを呼び出すことはできません。 JPQLにも同じ制限があります。最終的には両方ともSQLクエリに変換され、任意のJavaオブジェクトの呼び出しメソッドはあまりうまく収まりません。

また、フィールドまたはメソッドを使用してこのメ​​ソッドにアクセスしようとしても問題ありません。その理由は、java.net.URLのフィールドがエンティティにマップされた永続属性と異なるからです。 URLフィールドは永続化されないため(SQLで照会することはできません)、シリアライズ可能なオブジェクトはバイト配列などのシリアライズによって永続化されます。

また、呼び出し元は、驚きを引き起こす可能性のjava.net.URLに等しい:

java.net.url Javadocジャストタイプとして文字列で行くと、データベース内のそのフィールドが驚くほど長いURLのためにも十分な長さに注意しておきます。

+0

「URL」オブジェクトの代わりにURLに単純な文字列を使用する場合は+1。 –

+0

私はこれをやったことがありますが、_LIKE_を含むクエリはこのように不可能ですが、_URL.equalsが破損しているため(Object)_メソッドです。私はURLのこの特定の側面について完全に忘れてしまった。この種の問合せを発行する必要があるかどうかはわかりませんが、そうでない場合はURLの代わりに_URI_を使用します。それまで:レスキュー用の文字列!答えをありがとう! –

+0

URIとJPA(Hibernate)に関する単なる楽しい事実:URLは注釈魔術なしでHibernateによって自動的にマッピングされますが、URIはそうではありません。カスタムタイプを定義する必要があります。基本的に[_UrlType_](http://docs.jboss.org/hibernate/core/3.6/javadocs/org/hibernate/type/UrlType.html)と[_UrlTypeDescriptor_](http://docs.jboss)を模倣する必要があります。 org/hibernate/core/3.6/javadocs/org/hibernate/type/descriptor/java/UrlTypeDescriptor.html)を使用してください。その後、URI型フィールドのマッピングは透過的に行われます。 –

関連する問題