не найден конвертер, способный преобразовывать из AbstractJPAQuery в DTO

#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();
}