Спецификации Spring Data JPA – Distinct + порядок по столбцу в соединенииJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Спецификации Spring Data JPA – Distinct + порядок по столбцу в соединении

Сообщение Anonymous »

У меня есть некоторые спецификации, которые я объединяю с помощью «и»:

Код: Выделить всё

Specification.where(predicate1).and(predicate2).and(predicate3);
Один из них имеет отдельный набор:

Код: Выделить всё

query.distinct(true);
Другой упорядочивает столбец, находящийся в объединении.

Код: Выделить всё

query.orderBy(builder.desc(bJoin.get("orderbyColumn")));
Это не удается из-за SQLGrammarException, указывающего, что порядок по столбцам должен быть различным.
Итак, в основном у нас есть объект A, основной объект и некоторый вложенный объект B, мы выбираем из A, но хотим упорядочить по B, а в сгенерированном sql он выбирает только столбцы из A. Единственный способ, который я нашел, чтобы заставить его работать (= заставить его выбирать из B как ну) это заменить соединение выборкой:

Код: Выделить всё

Fetch < A, B > bFetch = root.fetch("joinCol", JoinType.INNER);
Join < A, B > bJoin = (Join < A, B > ) bFetch;
который работал некоторое время, тестировал локально в H2, но затем через некоторое время начал получать другую ошибку:

org.hibernate.QueryException: запрос указал выборку соединения, но
владелец выбранной ассоциации не присутствовал в списке выбора


Я каким-то образом решил эту проблему в своем локальном указателе на H2, потребовав, чтобы некоторые столбцы не были нулевыми, но на реальном сервере, использующем PostgreSQL, это вообще не работает, получая эту ошибку во всех случаях, когда присутствует выборка.
Мой вопрос: как правильно использовать distinct вместе с orderby во вложенных объект, который не извлекается? Подходит ли мое решение с fetch, и его просто нужно исправить (и если да, то как?) или мне следует полностью выбрать другой вариант?
Для реального запроса я использую этот метод:

Код: Выделить всё

findAll(Specification, Pageable)
Нет ли способа distinct обернуть весь запрос по порядку (какой-то подзапрос?) и обойти весь этот кошмар? Пусть он сгенерирует такой запрос:

Код: Выделить всё

select distinct colA1, colA2, coAl3 from (select colA1, colA2, coAl3

from A inner join B b on ........ order by b.colB1)
Нужно ли мне преобразовать мою спецификацию в предикат вручную и сделать с ней что-то еще, чтобы попытаться решить мои проблемы (какой-то гибридный подход)?
Будем очень признательны за любые советы.>

Подробнее здесь: https://stackoverflow.com/questions/624 ... mn-in-join
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»