powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. Projection.
4 сообщений из 4, страница 1 из 1
Hibernate. Projection.
    #38953663
lemur489
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Суть проблемы:
Есть две таблицы Product и Contract (one to one).
Нужно выполнить запрос в базу
Код: plsql
1.
select c.id, c.date, c.status, p.* from Contract c left join Product p on ...   where ...  order by p.index 



Нужны не все поля, поэтому исользую Projection

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Criteria crit = session.createCriteria(Contract.class);
crit.createAlias("product", "p");
crit.addOrder(org.hibernate.criterion.Order.desc("p.index"));
crit.setProjection(Projections.projectionList().
add(Projections.property("id"),"id").
add(Projections.property("date"), "date").
add(Projections.property("product"), "product").
add(Projections.groupProperty(p.index)).
add(Projections.groupProperty("id"))).
setResultTransformer(Transformers.aliasToBean(Contraсt.class));



Запрос выполняется без ошибок, поля подгружаются, кроме поля "p". Оно всё время null. В запросе который посылает хибернейт в селекте есть все поля кроме поля Продукт.
Если я сортирую по полю которое принадлежит таблицы Контракта или не сортирую вообще, то всё возвращает правильно.

Кажется мне, что-то здесь не так с джоинами внутри Projection листа. Пробовал след. образом add(Projections.property("p"), "p"). (и другие варианты, такие как "product","p" ; "p","product") - оно пишет, что либо такого поля не существует, либо нет сеттера для данного поля.


Заранее благодарю! Если нужна какая-то еще информация буду рад предоставить!
...
Рейтинг: 0 / 0
Hibernate. Projection.
    #38953712
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот этот код, зачем он тут?
Код: java
1.
2.
add(Projections.groupProperty(p.index)).
add(Projections.groupProperty("id"))).


при этом поле c.status (из запроса) в проекции пропущено...
...
Рейтинг: 0 / 0
Hibernate. Projection.
    #38953783
lemur489
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Projections.groupProperty(p.index) - hibernate требует чтобы было в GROUP BY

Projections.groupProperty("id") - заменяю дистинкт(ниже расскажу почему)
Думаю можно оставить, любой из этих.



Про дубликаты.
Запрос на самом деле выглядет немного сложнее - (таблица Setting связана с полем Product many-to-one)
Код: plsql
1.
2.
select c.id, c.date, c.status, p.* from Contract c left join Product p on ...  
left join Setting s on ...    where s.field <> X  order by p.index limit 15



(может быть не совсем корректно описал зависимости, но не сильно важно)

В чем суть: так как связь у нас многие к одному, на запрос s.field <> X оно возвращает дублирующие строки. Из 15 строк только например 3 или 4 будут уникальные. Окей, попробуем дописать DISTINCT_ROOT_ENTITY. Теперь оно убирает повторяющиеся строки, но делает это внутри этих 15 штук. То есть на выходе моего запроса я получаю не 15 уникальных значений, а только 3 или 4.

всё это сделано, для pagination и полученный результат меня не удовлетворяет. На каждой странице по 3,4 записи вместо 15.
поэтому и решил сделать это через GROUP BY(sql запрос в базу работает отлично) и соответсвующие проблемы. Если подскажете, как можно сделать правильный дистинкт - буду очень признателен.
...
Рейтинг: 0 / 0
Hibernate. Projection.
    #38953785
lemur489
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ivanraпри этом поле c.status (из запроса) в проекции пропущено...

действительно, забыл :(
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Hibernate. Projection.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]