#hibernate #jpa #spring-data-jpa #jpql
Вопрос:
Может кто-нибудь, пожалуйста, рассказать, как использовать приведенный ниже собственный запрос в JPA? Теперь я получаю сообщение об ошибке, поскольку конвертер не найден.
Sql-запрос, дающий правильный ответ в БД (MYSQL)
SELECT SUM(CASE WHEN Status = 'PENDING' THEN 1 ELSE 0 END) AS `pendingRequest`,
SUM(CASE WHEN Status = 'ACTIVE' or Status ='READY' THEN 1 ELSE 0 END) AS `approvedRequest`,
SUM(CASE WHEN Status = 'FAILED' THEN 1 ELSE 0 END) AS `rejectedRequest`,
SUM(CASE WHEN Status = 'ACTIVE' or Status ='READY' or Status ='PENDING' or Status ='FAILED' THEN 1 ELSE 0 END) as totalRequest FROM fiu_consent_db.consent_request;
Запрос, который я использовал в репозитории JPA
@Query(value = "SELECT SUM(CASE WHEN Status = 'PENDING' THEN 1 ELSE 0 END) AS `pendingRequest`,n"
" SUM(CASE WHEN Status = 'ACTIVE' or Status ='READY' THEN 1 ELSE 0 END) AS `approvedRequest`,n"
" SUM(CASE WHEN Status = 'FAILED' THEN 1 ELSE 0 END) AS `rejectedRequest`,n"
" SUM(CASE WHEN Status = 'ACTIVE' or Status ='READY' or Status ='PENDING' or Status ='FAILED' THEN 1 ELSE 0 END) AS `totalRequest` FROM fiu_consent_db.consent_request",nativeQuery = true)
ConsentRequestCount getAllConsentRequestCount();
DTO, который я создал
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConsentRequestCount {
private long pendingRequest;
private long approvedRequest;
private long rejectedRequest;
private long totalRequest;
}
Я создал отдельный DTO для этих 4 файлов и взял тип данных как длинный (пробовал также с помощью int), но его не удалось сопоставить.
Может кто-нибудь, пожалуйста, посоветуйте мне это?
Комментарии:
1. Здравствуйте, пожалуйста, добавьте также метод запроса, который снабжен вашими
@Query
2. Также добавьте полный код, а не только части, например, класс DTO, опубликуйте его полностью, а не только его поля, например, создали ли вы для него геттеры / сеттеры?
3. @pleft добавил метод
4. И ошибка stacktrace пожалуйста, постарайтесь предоставить как можно больше информации, чтобы другие участники могли вам помочь.
5. пытаюсь добавить, но возникают некоторые проблемы с форматом, а для геттеров и сеттеров я использовал lombok
Ответ №1:
В соответствии с этим, проекции DTO на основе классов не работают с собственными запросами. Вы можете переключиться на проекции DTO на основе интерфейса, изменив свой класс DTO на interface
Итак, этот DTO:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ConsentRequestCount {
private long pendingRequest;
private long approvedRequest;
private long rejectedRequest;
private long totalRequest;
}
измените его на интерфейс:
public interface ConsentRequestCount {
long getPendingRequest();
long getApprovedRequest();
long getRejectedRequest();
long getTotalRequest();
}