HQL: Как выбрать все объекты, различающиеся по некоторым столбцам? - PullRequest
19 голосов
/ 19 января 2011



Простой вопрос:
В этом примере мне нужно получить все объекты, но эти объекты должны иметь различные поля msgFrom.
Когда я использую

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);

Я получаю следующую ошибку:

java.lang.ClassCastException: java.lang.Integer cannot be cast to com.example.model.Message

Полагаю, это потому, что Hibernate извлекает только один столбец, но мне нужен объект, а не столбец.
Как я могу это сделать?
Я думаю, что могу просто прокрутить запятую, т.е.

List<Message> list = getHibernateTemplate().find("select distinct m.msgFrom, m.To, m.datetime, .......... from Message m WHERE msgTo = ? AND msgCheck = 0", dinc);

Но что, если у меня здесь более 20 полей? Есть ли простое решение?

Спасибо!

Ответы [ 5 ]

26 голосов
/ 20 января 2011

Вы также можете использовать Критерии и Проекции вместе:

Criteria criteria = session.createCriteria( MyEntity.class );
criteria.setProjection( Projections.distinct( Projections.property( "id" ) ) );

Надеюсь, это кому-нибудь поможет.

17 голосов
/ 19 января 2011

Ниже приведен пример запроса:

select e from Message e 
where e.msgFrom IN (select distinct m.msgFrom 
                      from Message m
                      WHERE m.msgTo = ? 
                      AND m.msgCheck = "0");

Кроме того, вы также можете использовать Criteria API.

6 голосов
/ 29 марта 2016

Критерии гибернации довольно легко выбрать отличительные результаты. Если вы хотите, чтобы в прогнозируемом результате был возвращен один результат, вы можете использовать:

Criteria criteria = session.createCriteria(Message.class);
criteria.setProjection(Projections.distinct(Projections.property("msgFrom ")));
List<String> msgFromList = criteria.list();

Если вы хотите, чтобы результат включал весь класс Message со всем набором его свойств, вы можете использовать Hibernate result Transformer,

Criteria criteria = session.createCriteria(Message.class);
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
List<Message> messages = criteria.list();

Но он фильтрует на основе корневого объекта.

Или

Criteria criteria = session.createCriteria(Message.class);

ProjectionList projection = Projections.projectionList();
projection.add(Projections.distinct(Projections.property("msgFrom")));
//Add as many columns as you want using Projection
projection.add(Projections.property("msgTo"));
criteria.setProjection(projection);

criteria.setResultTransformer(Transformers.aliasToBean(Message.class));
List<String> msgFromList = criteria.list();

По вашему вопросу первое решение дает правильный вывод.

3 голосов
/ 03 сентября 2011

Попробуйте, у меня это сработало:

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName
0 голосов
/ 22 февраля 2013

У меня есть ответ на Hibernate Query Language для использования различных полей.Вы можете использовать SELECT DISTINCT(TO_CITY) FROM FLIGHT_ROUTE.Если вы используете SQL-запрос, он возвращает String List.Вы не можете использовать это возвращаемое значение по классу сущностей.Таким образом, ответом для решения этого типа проблемы является использование HQL с SQL.

"FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY)";

Из оператора запроса SQL он получил DISTINCT ROUTE_ID и введен в виде списка.И IN-фильтр фильтрует различные TO_CITY из IN (список).

Тип возвращаемого значения - это тип Entity Bean.Так что вы можете сделать это в AJAX, например, в автозаполнении.

Может быть, все в порядке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...