Получить список ID сущностей через Spring Data JPA

9. Получить ID сущностей через Spring Data JPA

Условие задачи:
В репозитории HeavyDataRepository необходимо реализовать метод, который возвращает список только идентификаторов сущностей HeavyData, не загружая объекты целиком.

Код:

public interface HeavyDataRepository
        extends JpaRepository<HeavyData, Integer> {

    List<Integer> getHeavyDataIds();

    List<HeavyData> findAllByIsActive(Boolean isActive);
}

Спойлеры к решению

Подсказки
💡 Для выборки отдельных полей можно использовать @Query.
💡 В JPQL нужно обращаться к сущности и её полям, а не к таблице.
💡 Запрос select h.id from HeavyData h загрузит только значения id.
💡 Возвращаемый тип должен соответствовать типу поля id.

Решение
public interface HeavyDataRepository
        extends JpaRepository<HeavyData, Integer> {

    @Query("select h.id from HeavyData h")
    List<Integer> getHeavyDataIds();

    List<HeavyData> findAllByIsActive(Boolean isActive);
}

JPQL-запрос:

@Query("select h.id from HeavyData h")

выбирает только поле id, поэтому Hibernate не создаёт и не загружает целиком объекты HeavyData.

Если необходимо использовать нативный SQL:

@Query(
        value = "select id from heavy_data",
        nativeQuery = true
)
List<Integer> getHeavyDataIds();

Для JPQL используется имя сущности HeavyData, а для нативного SQL — реальное имя таблицы в базе данных.