Подтвердить что ты не робот

Сохранение 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();

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

Есть ли способ сделать это? Сохраняет ли постоянство тип возвращаемого запроса? (Возможно, через дженерики?)

4b9b3361

Ответ 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();