Я новичок в 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? Существуют ли какие-либо аннотации на уровне поля для этого?
Спасибо, я думаю, это сработает. И я просто вычисляю Dayname() и Datediff(), используя стандартную Java?
да, может быть, вам будет лучше, если вы вычислите, какLongAgo в своей сущности. но вы могли бы сделать в своем запросе
Вы уверены, что это можно сделать в запросе? Если я правильно понял, @Transient ничего не получает из запроса...
Я думаю, что эта статья подробно отвечает на него - vladmihalcea.com/…
используйте подход Влада, если он соответствует вашим потребностям... необязательно, вы можете вычислить переходные свойства - это геттер или заполнить их с помощью дополнительного конструктора...
Я решил ту же проблему, используя проекции на основе интерфейса, пожалуйста, взгляните на мое предложение и дайте мне знать, работает ли оно для вас.




Вам нужно использовать Проекции на основе интерфейса:
Вам нужно будет создать интерфейс, который определяет геттеры для каждого поля в вашей проекции, например:
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 параметра.
Спасибо за это! Я попробую и дам вам знать, если это сработает для меня.
возможно, вы могли бы добавить свойство Как давно в свою сущность и пометить его как @транзиент?