Это называется проекция , и Spring предлагает вам два способа сделать это.
Имейте в виду, что это существует в терминах JPA, а не только в Spring.
Принимая Repository
в качестве отправной точки
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
...
}
мы можем использовать
interface
проекцию на основе
просто создать интерфейс, который представляет результат, который вы хотите получить
public interface StudentDetailProjection {
String getFirstName();
String getMiddleName();
String getLastName();
}
и добавьте метод к вашему Repository
@Repository
public interface StudentDetailsRepository extends JpaRepository<StudentDetail, Integer> {
StudentDetailProjection get...(...);
}
Spring автоматически создаст подкласс для этого интерфейса и попросит JPA выполнить запрос, который будет извлекать толькоуказанные поля.
class
проекция на основе
работает почти так же, как проекция на основе интерфейса, но прокси и подклассы не требуются, поскольку вы предлагаете Spring конкретный класс.
public class StudentDetailProjection {
private final String getFirstName;
private final String getMiddleName;
private final String getLastName;
public StudentDetailProjection(
final String getFirstName,
final String getMiddleName,
final String getLastName,
) {...}
// Getters
}
Документация идет глубже.
Также необходимо прочитать это сообщение в блоге Влада Михалча, мастера JPA.
Метод может выглядеть примерно так:
@Query("select new your.package.StudentDetailProjection(d.firstName, d.middleName, d.lastName) from StudentDetail d where month(d.dateOfBirth) = ?1")
List<StudentDetailProjection> getStudentListBasedOnDateOfBirth(final int month);
Это будет идти по конкретному варианту class
(2), поскольку требуется конструктор.