Подтвердить что ты не робот

HQL: Как выбрать все сущности, отличные от некоторого столбца?



Простой вопрос:
В этом примере мне нужно получить все объекты, но эти объекты должны иметь разные поля 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 полей? Есть ли простое решение?

Спасибо!

4b9b3361

Ответ 1

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

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

В качестве альтернативы вы также можете использовать API критериев.

Ответ 2

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

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

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

Ответ 3

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

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

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

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();

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

Ответ 4

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

SELECT FROM YourTableName 
WHERE somecolumnName=condition 
GROUP BY yourDistinctColumnName

Ответ 5

У меня есть ответ для языка запросов Hibernate для использования полей Distinct. Вы можете использовать SELECT DISTINCT(TO_CITY) FROM FLIGHT_ROUTE. Если вы используете SQL-запрос, он возвращает String List. Вы не можете использовать возвращаемое значение для класса Entity. Таким образом, ответом на решение этого типа проблемы является использование 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, таком как AutoComplement.

Все в порядке

Ответ 6

  Как ответ @APC

это работает, и это может быть более ясно, как

SELECT FROM Object o 
WHERE o.propCondition = condition
GROUP BY o.propDistinct