Собственный запрос JPA с одним и тем же столбцом дважды - PullRequest
0 голосов
/ 05 марта 2019

Я новичок в JPA и хотел иметь собственный запрос JPA для одной таблицы (ниже), которую я хотел бы получить в своем классе на основе @Entity под названием TestRequest.У него есть столбец RequestTime, который выбирается с помощью функции DAYNAME (), а затем с помощью функций DATEDIFF ().

SELECT TestRequest.Id AS Id
               , TestRequest.RequestTime AS RequestTime
               , DAYNAME(TestRequest.RequestTime) AS RequestDay
               , TestRequest.StatusMessage AS StatusMessage
               , DATEDIFF(CURDATE(), TestRequest.RequestTime) AS HowLongAgo
            FROM TestRequest
                     LEFT JOIN TestRun
                               ON TestRequest.TestRunId = TestRun.Id
           WHERE Requestor = '[NAME]'
           ORDER BY Id DESC

Есть ли способ, которым столбец (извлекаемый во второй раз как HowLongAgo) может быть установлен в свойство, которое не отображается на столбец таблицы в классе TestRequest?Есть ли для этого какие-нибудь аннотации на уровне поля?

1 Ответ

0 голосов
/ 05 марта 2019

Вам необходимо использовать Проекции на основе интерфейса :

Вам нужно будет создать интерфейс, который определяет получатели для каждого поля в вашей проекции, например:

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 параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...