Как извлекать столбцы сопоставленного суперкласса с помощью jpa

#hibernate #spring-data-jpa

#впасть в спящий режим #весна-данные-jpa

Вопрос:

Я ищу аналогичный запрос Hibernate в Jpa.

В режиме гибернации я могу получить все столбцы сопоставленного суперкласса с помощью запроса:

 session.createQuery("from com.app.spring.entity.User", User.class);
 

Как я могу добиться этого с помощью jpa?
Я пробовал использовать SELECT NEW пользовательский запрос.

Также, если возможно, я хочу получить все записи дочерних классов, вызвав суперкласс, а не только общие атрибуты в суперклассе.

Ответ №1:

Как указано в документации:

Оператор select в JPQL точно такой же, как и для HQL, за исключением того, что JPQL требует a select_clause , тогда как HQL этого не делает.

Итак, вы можете исправить свой запрос следующим образом:

 List<User> users = entityManager.createQuery(
    "select u from com.app.spring.entity.User u", User.class)
.getResultList();
 

Также, как это объясняется в этом разделе документации:

Запросы HQL и JPQL по своей сути полиморфны.

Этот запрос User явно называет объект. Однако все подклассы User также доступны для запроса. Итак, если объекты UserA и UserB расширяют User класс, все три типа будут доступны для запроса сущности, и запрос вернет экземпляры всех трех.

Вы даже можете написать что-то вроде этого:

 public interface UserRepository extends CrudRepository<User, Long>
{
   @Query("select o from java.lang.Object o")
   List<Object> findAllEntities();
}
 

хотя это не очень практично с точки зрения производительности.

Комментарии:

1. разве это не может быть достигнуто без использования EntityManager. Как это @Query(«ВЫБРАТЬ * ОТ пользователя») Коллекция<Пользователь> findAllActiveUsers();

2. Да, конечно, вы можете использовать @Query("select u from com.app.spring.entity.User u")

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

4. Похоже, это просто проблема с вашим отображением, см. Обновленный ответ.

5. при использовании inheritance.joined, как извлекать все строки, как для родительского, так и для дочернего, с помощью jpa-запроса