Вам необходимо использовать Проекции на основе интерфейса :
Вам нужно будет создать интерфейс, который определяет получатели для каждого поля в вашей проекции, например:
public interface RequestJoinRunProjection {
int getId();
LocalDate getRequestTime();
String getMessage();
String getRequestDay();
Long getHowLongAgo();
}
Затем вы определяете метод в вашем репозитории, который имеет собственный запрос, который вы хотите выполнить:
public interface TestRequestRepository extends CrudRepository<TestRequest, Long> {
// Any other custom method for TestRequest entity
@Query(value = "SELECT trq.Id AS id " +
" , trq.RequestTime AS requestTime " +
" , DAYNAME(trq.RequestTime) AS requestDay " +
" , trq.StatusMessage AS statusMessage " +
" , DATEDIFF(YEAR, CURDATE(), trq.RequestTime) AS howLongAgo " +
"FROM TestRequest trq " +
" LEFT JOIN TestRun tr " +
" ON trq.TestRunId = tr.Id " +
"WHERE Requestor = ?1 ORDER BY Id DESC"), nativeQuery = true)
List<RequestJoinRunProjection> findTestSumary(String name);
}
Запрос уведомления должен быть нативным, поскольку вы используете функции базы данных, также имена столбцов должны соответствовать установщикам вашего интерфейса проекции (следуя правилам bean-компонентов), поэтому используйте AS
для изменения имен в вашем запросе.
Я настоятельно рекомендую вам проверить свой запрос на h2, прежде чем вводить в аннотацию @Query
. DATEDIFF
требуется 3 параметра.