ребята, я хотел бы задать вам простой вопрос.
Я создаю два одинаковых запроса, один с критериями, а другой с HQL.
Пример HQL
@Override
public List<Object[]> getAllLoginHQL() {
Query<Object[]> query = manager.getSession()
.createQuery("select user.firstName from User user",Object[].class);
return query.getResultList();
}
Пример критерия:
@Override
public List<User> getAllLoginCriteria() {
Criteria criteria = manager.getSession()
.createCriteria(User.class)
.setProjection(Projections.projectionList()
.add(Projections.property("firstName"), "firstName"))
.setResultTransformer(Transformers.aliasToBean(User.class));
return criteria.list();
}
Как видите, оба запроса делают одно и то же, но когда я попытался создать HQL-запрос с типом возврата List<User>
, я получил исключение с сообщением, что типом возврата этого запроса является List<String>
.
Я хотел бы знать, почему Criteria может возвращать весь объект (с нулем внутри), даже когда я запрашиваю один / два столбца, а HQL возвращает только определенные столбцы?
Этот HQL-запрос дает исключение
@Override
public List<User> getAllLoginHQL() {
Query<User> query = manager.getSession()
.createQuery("select user.firstName from User user",User.class);
return query.getResultList();
}
Сообщение об исключении:
Type specified for TypedQuery is incompatible with query return type [class java.lang.String]