2017-02-10 5 views
0

私はCLOB属性を持つエンティティがあります。CLOBおよびCriteriaQuery

:我々は結果が一意である必要がCriteriaQueryを使用して、私たちが行うDBから特定のEntitySを取得するには

public class EntityS { 
    ... 
    @Lob 
    private String description; 
} 

を我々は次のエラーを取得することを行う場合

query.where(builder.and(predicates.toArray(new Predicate[predicates.size()]))).distinct(true).orderBy(builder.asc(root.<Long> get(EntityS_.id))); 

ORA-00932: inconsistent datatypes: expected - got CLOB 

私はそれはあなたがDISTを使用することはできませんので、知っていますCLOBを選択するときにインサクト。しかし、我々はCLOBが必要です。 CriteriaQueryと述語などを使用してこれを回避する方法がありますか?

私たちは.unique(true)を取り除き、結果をフィルタリングする醜い回避策を使用していますが、それは駄目です。私たちはアプリケーションの開発を継続できるようにするためにのみ使用していますが、私たちはもっと良い解決策が必要です。私はそれを見つけられないようです...

答えて

0

これはうまくいかないおそらくそれはショットの価値がある。 (私はそれをテストし、動作しているようですが、私はちょうど1列、CLOBデータ・タイプ、2列の表を作成し、両方の値to_clob('abcd')で - もちろんそれは、その設定で動作するはずです。)

重複排除を行うには、各clobのハッシュを計算し、ハッシュ値でパーティション化された行番号を計算し、nothing(null)で順序付けされるようにOracleに指示します。次に、行番号が1の行だけを選択します。tは、作成した表であり、1つのCLOB列がcとなっています。

私は実行時間がかなり良いと思う。もちろん、最大の問題は衝突です。 CLOBのどれかが欠けていないことと、最初に基本表にいくつの行があるのか​​がどれくらい重要なのでしょうか?衝突を受け入れることの「十億の1つのチャンス」のようなものですか?

select c 
from (
select c, row_number() over (partition by dbms_crypto.hash(c, 3) order by null) as rn 
from t 
) 
where rn = 1; 

注 - (あなたのケースでは、アプリケーション、)ユーザーがSYS.DBMS_CRYPTOEXECUTE権限を持っている必要があります。 DBAは必要に応じて付与することができます。

+0

おそらく私は何かが欠けているかもしれませんが、CriteriaQueryを使ってどうすればいいですか? – diminuta