首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLOB和CriteriaQuery

CLOB和CriteriaQuery
EN

Stack Overflow用户
提问于 2017-02-10 21:12:07
回答 2查看 1.3K关注 0票数 2

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

代码语言:javascript
复制
public class EntityS {
  ...
  @Lob
  private String description;
}

为了从数据库中检索特定的EntityS,我们使用一个CriteriaQuery,其中我们需要结果是唯一的,所以我们这样做:

代码语言:javascript
复制
query.where(builder.and(predicates.toArray(new Predicate[predicates.size()]))).distinct(true).orderBy(builder.asc(root.<Long> get(EntityS_.id)));

如果我们这样做,我们会得到以下错误:

代码语言:javascript
复制
ORA-00932: inconsistent datatypes: expected - got CLOB

我知道这是因为在选择CLOB时不能使用distinct。但我们需要CLOB。有没有解决这个问题的办法,使用带有谓词的CriteriaQuery等等?

我们正在使用一个丑陋的变通方法,去掉.unique(真的),然后过滤结果,但这是垃圾。我们使用它只是为了能够继续开发应用程序,但我们需要一个更好的解决方案,而我似乎找不到一个……

EN

回答 2

Stack Overflow用户

发布于 2019-12-09 17:37:34

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

代码语言:javascript
复制
query.setHint(QueryHints.HINT_PASS_DISTINCT_THROUGH, false);

这样," distinct“不会传递给SQL命令,但Hibernate将只返回distinct值。

更多信息请看这里:https://thoughts-on-java.org/hibernate-tips-apply-distinct-to-jpql-but-not-sql-query/

票数 1
EN

Stack Overflow用户

发布于 2017-02-11 00:58:00

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

要消除重复数据,请计算每个clob的散列,并指示Oracle计算按散列值分区并按nothing (null)排序的行号。然后只选择行号为1的行。如下所示(CLOB表是我创建的表,其中有一个名为ct列)。

我希望执行时间应该是相当好的。当然,最大的担忧是碰撞。不遗漏任何CLOB有多重要,以及首先在基表中有多少行?发生碰撞的“十亿分之一”这样的事情是可以接受的吗?

代码语言:javascript
复制
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_CRYPTO上的EXECUTE权限。如果需要,DBA可以授予它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42160273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档