我有一个具有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等等?
我们正在使用一个丑陋的变通方法,去掉.unique(真的),然后过滤结果,但这是垃圾。我们使用它只是为了能够继续开发应用程序,但我们需要一个更好的解决方案,而我似乎找不到一个……
发布于 2019-12-09 17:37:34
如果您使用Hibernate作为持久性提供者,则可以指定以下查询提示:
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/
发布于 2017-02-11 00:58:00
跳出框框思考-我不知道这是否有效,但也许值得一试。(我对它进行了测试,它似乎可以工作,但我创建了一个只有一列、CLOB数据类型和两行的表,这两列的值都是to_clob('abcd') -当然,它应该可以在上运行,也就是设置。)
要消除重复数据,请计算每个clob的散列,并指示Oracle计算按散列值分区并按nothing (null)排序的行号。然后只选择行号为1的行。如下所示(CLOB表是我创建的表,其中有一个名为c的t列)。
我希望执行时间应该是相当好的。当然,最大的担忧是碰撞。不遗漏任何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_CRYPTO上的EXECUTE权限。如果需要,DBA可以授予它。
https://stackoverflow.com/questions/42160273
复制相似问题