Собственный запрос JPA с одним и тем же столбцом дважды

Я новичок в 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? Существуют ли какие-либо аннотации на уровне поля для этого?

возможно, вы могли бы добавить свойство Как давно в свою сущность и пометить его как @транзиент?

Dirk Deyne 05.03.2019 19:01

Спасибо, я думаю, это сработает. И я просто вычисляю Dayname() и Datediff(), используя стандартную Java?

javshak 05.03.2019 20:00

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

Dirk Deyne 05.03.2019 20:12

Вы уверены, что это можно сделать в запросе? Если я правильно понял, @Transient ничего не получает из запроса...

javshak 05.03.2019 21:27

Я думаю, что эта статья подробно отвечает на него - vladmihalcea.com/…

javshak 05.03.2019 21:41

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

Dirk Deyne 05.03.2019 21:54

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

Cristian Colorado 05.03.2019 22:08
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
0
7
491
1

Ответы 1

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

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

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

Спасибо за это! Я попробую и дам вам знать, если это сработает для меня.

javshak 07.03.2019 23:03

Другие вопросы по теме