CLOB和CriteriaQuery

时间:2017-02-10 13:12:07

标签: java oracle hibernate clob criteriaquery

我有一个具有CLOB属性的实体:

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

要从数据库中检索某些EntityS,我们使用CriteriaQuery,我们需要结果是唯一的,所以我们这样做:

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

我知道这是因为在选择CLOB时你不能使用distinct。但我们需要CLOB。有没有使用CriteriaQuery with Predicates等的解决方法?

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

2 个答案:

答案 0 :(得分:1)

如果您使用Hibernate作为持久性提供程序,则可以指定以下查询提示:

query.setHint(QueryHints.HINT_PASS_DISTINCT_THROUGH, false);

这样,“ distinct”不会传递到SQL命令,但是Hibernate将负责仅返回不同的值。

有关更多信息,请参见此处:https://thoughts-on-java.org/hibernate-tips-apply-distinct-to-jpql-but-not-sql-query/

答案 1 :(得分:0)

在盒子外思考 - 我不知道这是否有效,但也许值得一试。 (我测试了它似乎工作,但我创建了一个只有一列,CLOB数据类型和两行的表,两者都有值to_clob('abcd') - 当然它应该在上工作设置。)

要重复数据删除,请计算每个clob的哈希值,并指示Oracle计算由哈希值分区并按空格排序的行号(null)。然后选择行号为1的行。如下所示(t是我创建的表,其中一个CLOB列名为c)。

我希望执行时间应该相当不错。当然,最大的担忧是碰撞。你不会错过任何CLOB,首先在基表中有多少行,这有多重要?类似于“十亿”中的一次机会&#34;碰撞可以接受吗?

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;

注意 - 用户(您的应用程序,在您的情况下)必须具有EXECUTE SYS.DBMS_CRYPTO特权。如果需要,DBA可以授予它。

相关问题