Сохранение Java: приведение к чему-либо результат Query.getResultList ()? - PullRequest
31 голосов
/ 05 июня 2009

Привет всем, я новичок в постоянстве / гибернации и мне нужна ваша помощь.

Вот ситуация. У меня есть таблица, которая содержит некоторые вещи. Давайте назовем их людьми. Я хотел бы получить все записи из базы данных, которые находятся в этой таблице.

У меня есть класс Person, который является простым POJO со свойством для каждого столбца в таблице (имя, возраст, ..)

Вот что у меня есть:

Query lQuery = myEntityManager.createQuery("from Person")
List<Person> personList = lQuery.getResultList();

Однако я получаю предупреждение о том, что это неконтролируемое преобразование из List в List<Person>

Я думал, что просто изменив код на

Query lQuery = myEntityManager.createQuery("from Person")
List<Person> personList = (List<Person>)lQuery.getResultList();

будет работать .. но это не так.

Есть ли способ сделать это? Позволяет ли постоянство установить тип возвращаемого значения запроса? (Через дженерики может быть?)

Ответы [ 5 ]

68 голосов
/ 28 августа 2012
9 голосов
/ 05 июня 2009

Примечание. Этот ответ устарел с версии JPA 2.0, что позволяет указывать ожидаемый тип. См. этот ответ .


Подавление предупреждения с помощью

@SuppressWarnings("unchecked")
List<MyType> result = (List<MyType>) query.getResultList();

- единственное решение этой проблемы, которое я когда-либо видел. Подавление ужасно, но вы можете доверять JPA, чтобы он возвращал правильный тип объекта, поэтому нет необходимости проверять вручную.

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

public List<T extends MyBaseType> findMyType(Class<T> type) {
    @SuppressWarnings("unchecked")
    List<T> result = (List<T>) this.entityManager.createQuery(
        "FROM " + type.getName())
        .getResultList();
    return result;
}
2 голосов
/ 05 июня 2009

Что ж, есть решение класса java Collections, но вы не объяснили, почему ваш кастинг не удался или просто выдавало предупреждение ...

Это один из способов проверить это:

Collections.checkList(lQuery.getResultList(), Person.class);

Но если вам не нужно проверять это:

@SuppressWarnings("unchecked") List<Person> personList = lQuery.getResultList();
1 голос
/ 04 ноября 2017

Альтернативный способ:

Query query = entityManager.createNativeQuery("SELECT * FROM person", Person.class);
List<Person> rows = query.getResultList();
1 голос
/ 05 июня 2009

Я тоже застрял с этой проблемой некоторое время. Вы можете перебрать список и проверить, но я бы предпочел меньше шума. Самый короткий путь, который я видел, чтобы обойти это, состоит в том, чтобы заставить замолчать предупреждение, но мне также очень неудобно это Мне было бы интересно увидеть другие решения.

@SuppressWarnings("unchecked") 
List<Person> personList = lQuery.getResultList();

Хм, во время исследования я нашел интересную запись на java.net. Я нашел комментарии пользователей особенно интересными.

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