2017-02-10 23 views
0

У меня есть объект, который имеет атрибут CLOB:CLOB и CriteriaQuery

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 

Я знаю, что это потому, что вы не можете использовать расст inct при выборе CLOB. Но нам нужен CLOB. Есть ли обходной путь для этого, используя CriteriaQuery с Predicates и т. Д.?

Мы используем уродливое обходное решение, избавляющееся от .unique (true), а затем фильтрацию результатов, но это дерьмо. Мы используем его только для того, чтобы иметь возможность продолжать разработку приложения, но нам нужно лучшее решение, и я, кажется, не нашел его ...

ответ

0

Мышление вне коробки - я понятия не имею, будет ли это работать , но, возможно, это стоит того. (Я проверил это, и это, кажется, работает, но я создал таблицу с только один столбец, тип данных CLOB, и два ряда, как со значением to_clob('abcd') -., Конечно, она должна работать на , что установки)

Чтобы удалить дубликаты, вычислите хэш каждого clob и поручите Oracle вычислить номер строки, разделенный хэш-значением и упорядоченный ничем (null). Затем выберите только строки, в которых число строк равно 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; 

Примечание - пользователь (приложение, в вашем случае) должен иметь EXECUTE привилегию на SYS.DBMS_CRYPTO. Администратор базы данных может предоставить его, если необходимо.

+0

Может быть, мне что-то не хватает, но как мне это сделать с помощью CriteriaQuery? – diminuta

 Смежные вопросы

  • Нет связанных вопросов^_^