Сохранение Java: Придать чему-то результат Query.getResultList()?
Привет всем, я новичок в настойчивости/спящем режиме, и мне нужна ваша помощь.
Вот ситуация. У меня есть таблица, содержащая некоторые вещи. Позвольте назвать их людьми.
Я хотел бы получить все записи из базы данных, которые находятся в этой таблице.
У меня есть класс 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();
будет работать, но это не так.
Есть ли способ сделать это? Сохраняет ли постоянство тип возвращаемого запроса? (Возможно, через дженерики?)
Ответы
Ответ 1
Как новичок в JPA принимал это как окончательный ответ, но затем я нашел лучшего в этом вопросе: Почему в запросах EntityManager JPA выбрасывается NoResultException, но не находит?
Это так же просто, как использование TypedQuery вместо Query, например:
TypedQuery<Person> lQuery = myEntityManager.createQuery("from Person", Person.class);
List<Person> personList = lQuery.getResultList();
Ответ 2
Примечание. Этот ответ устарел с JPA 2.0, который позволяет вам указать ожидаемый тип. См. этот ответ.
Подавление предупреждения с помощью
@SuppressWarnings("unchecked")
List<MyType> result = (List<MyType>) query.getResultList();
- единственное решение этой проблемы, которое я когда-либо видел. Подавление является уродливым, но вы можете доверять JPA, чтобы вернуть правильный тип объекта, поэтому нет необходимости проверять вручную.
Если вы используете полиморфизмы и не знаете точный тип результата, использование Generics с ограниченным параметром 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;
}
Ответ 3
Ну, есть решение класса java Collections, но вы не объяснили, как закончилось ваше кастинг, или если он просто дал предупреждение...
Это один из способов проверить это:
Collections.checkList(lQuery.getResultList(), Person.class);
Но если вам не нужно его проверять:
@SuppressWarnings("unchecked") List<Person> personList = lQuery.getResultList();
Ответ 4
Я тоже застрял в этой проблеме. Вы можете перебирать список и проверять, но я бы предпочел меньше шума. Самый короткий путь, который я видел вокруг, - заставить замолчать предупреждение, но мне также очень неудобно. Мне было бы интересно увидеть другие решения.
@SuppressWarnings("unchecked")
List<Person> personList = lQuery.getResultList();
Хмм, при исследовании я нашел интересный post на java.net. Я нашел комментарии пользователей особенно интересными.
Ответ 5
Альтернативный способ:
Query query = entityManager.createNativeQuery("SELECT * FROM person", Person.class);
List<Person> rows = query.getResultList();