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 полей? Есть ли простое решение?
Спасибо!
Ответы
Ответ 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