JPA: «ВЫБЕРИТЕ DISTINCT» с BLOB-столбцами - PullRequest
3 голосов
/ 26 января 2009

Я пытаюсь выполнить этот запрос JPQL:

SELECT DISTINCT i FROM Table i JOIN i.other o

, который быстро завершается с:

"Внутреннее исключение: java.sql.SQLException: столбцы типа 'BLOB' нельзя использовать в операторах CREATE INDEX, ORDER BY, GROUP BY, UNION, INTERSECT, EXCEPT или DISTINCT, поскольку сравнения для этого типа не поддерживаются. «

Эта ошибка имеет смысл для меня, но как мне ее обойти?

Ответы [ 4 ]

3 голосов
/ 26 января 2009

Вы можете сохранить хэш или контрольную сумму объекта BLOB-объекта в другом столбце и использовать для этого свой отдельный оператор.

Пример:

SELECT i from Table  WHERE id IN (
  SELECT id FROM (
    SELECT MIN(id) AS id, hash_of_i FROM Table GROUP BY hash_of_i
                 ) t
                                )

Я уверен, что вы можете написать этот SQL более элегантно, но он даст вам представление.

Edit - только что понял, что с его помощью вы можете вообще обойтись без оператора Distinct (это будет функционально эквивалентно простому удалению).

Редактировать 2 - я не уверен, что моя первая версия сработала, поэтому переписал ее

2 голосов
/ 26 января 2009

Некоторое вдохновение от HermanD привело меня к этому рабочему решению:

SELECT i FROM Table i WHERE EXISTS (
    SELECT e FROM Table e JOIN e.other o WHERE e.id=i.id
)
0 голосов
/ 14 февраля 2015

используйте setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY) вместо различных по вашему запросу.

0 голосов
/ 26 января 2009

Значения в столбцах типа BLOB являются только указателями на фактическое хранение данных. Чтобы применить любой из этих операторов, вам нужно загрузить данные из BLOB и реализовать собственную логику, поскольку данные могут представлять что угодно (изображение, текст ...)

...