2017-02-10 106 views
0

我有了一个CLOB属性的实体:CLOB和CriteriaQuery中

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

为了取回我们使用CriteriaQuery中,我们需要的结果是唯一的DB某些实体来说,所以我们做的:

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和Predicates等有没有解决这个问题的方法?

我们正在使用一个丑陋的解决方法来摆脱.unique(true),然后过滤结果,但这是废话。我们使用它只是为了能够继续开发应用程序,但我们需要更好的解决方案,而且我似乎找不到一个...

回答

0

在盒子外面思考 - 我不知道这是否可行,但也许值得一试。 (我测试,它似乎工作,但我创建了一个表只有一列,CLOB数据类型,以及两排,既与价值to_clob('abcd') - 它当然应该安装工作)

要去复制,计算每个clob的散列,并指示Oracle计算一个由散列值分隔的行号,并按无(空)排序。然后选择行号为1的行。如下所示(t是我创建的表,其中一个CLOB列名为c)。

我期望执行时间应该是相当不错的。当然,最大的担忧是碰撞。你不会错过任何一个CLOB,你在基表中首先有多少行?就像“碰撞中的一次机会”中的碰撞是可以接受的?

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