Как критерии и HQL-запросы возвращают значения - PullRequest
0 голосов
/ 08 мая 2018

ребята, я хотел бы задать вам простой вопрос. Я создаю два одинаковых запроса, один с критериями, а другой с 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]

1 Ответ

0 голосов
/ 08 мая 2018

Смотрите здесь

Спецификация говорит, что вы можете сделать это, установив ResultTransformer.

Это будет примерно так:

   manager.getSession()
            .createQuery("select user.firstName from User user",Object[].class)
            .setResultTransformer(Transformers.aliasToBean(User.class))
            .getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...