Собственные запросы с аннотацией @Query в Spring - PullRequest
0 голосов
/ 01 июля 2018

У меня проблема с нативными запросами в Spring. Я использую аннотацию @Query с параметром nativeQuery = true и SQL-запросом в качестве значения параметра.

У меня есть следующий метод в файле RezerwacjaDao.java:

@Query(value = "select d.DATA, pt.POKOJTYP_ID, pt.POKOJTYP_NAZWA, 10 \n" +
        "from LISTADAT(:data_od, :data_do) d \n" +
        "left join POKOJTYP pt on 1=1 \n" +
        "order by d.DATA, pt.POKOJTYP_NAZWA",
        nativeQuery = true)
List<DostepnoscTypyListDTO> getDostepnoscNaTypy(
        @Param("data_od") Date dataOd,
        @Param("data_do") Date dataDo);

В файле RezerwacjaController.java у меня есть:

@GetMapping("/getDostepnoscNaTypy")
public @ResponseBody
List<DostepnoscTypyListDTO> getDostepnoscNaTypy(Date dataOd, Date dataDo) {               
   return rezMgr.getDostepnoscNaTypy(dataOd, dataDo);
}

А в RezerwacjaManager.java:

public List<DostepnoscTypyListDTO> getDostepnoscNaTypy(Date dataOd, Date dataDo) {     
    return rezerwacjaDao.getDostepnoscNaTypy(dataOd, dataDo);
}

Проблема в том, что вызывается метод rezerwacjaDao.getDostepnoscNaTypy (dataOd, dataDo) и выполняется этот запрос. Я получаю сообщение об ошибке:

"Failed to convert from type [java.lang.Object[]] to type [ekoncept.dto.DostepnoscTypyListDTO] for value '{2018-05-01 00:00:00.0, 4, Apartament, 10}'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.sql.Timestamp] to type [ekoncept.dto.DostepnoscTypyListDTO]",

DostepnoscTypyListDTO.java:

public class DostepnoscTypyListDTO {

   @Getter @Setter private Integer pokojtypId;
   @Getter @Setter private String pokojtypNazwa;
   @Getter @Setter private String naDzien;
   @Getter @Setter private Integer ileDostepnych;

    public DostepnoscTypyListDTO(
            String naDzien, Integer pokojtypId, String pokojtypNazwa,
            Integer ileDostepnych) {

        this.pokojtypId = pokojtypId;
        this.pokojtypNazwa = pokojtypNazwa;
        this.naDzien = naDzien;
        this.ileDostepnych = ileDostepnych;
    }

    public DostepnoscTypyListDTO(
            Timestamp naDzien, //Date naDzien,
            Integer pokojtypId, String pokojtypNazwa,
            Integer ileDostepnych)  {

        SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd");
        this.naDzien = df.format(naDzien);  //naDzien;

        this.pokojtypId = pokojtypId;
        this.pokojtypNazwa = pokojtypNazwa;
        this.ileDostepnych = ileDostepnych;
    }
}

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Вам необходимо изменить тип возврата вашего запроса на List<Object[]>

@Query(value = "select d.DATA, pt.POKOJTYP_ID, pt.POKOJTYP_NAZWA, 10 \n" +
        "from LISTADAT(:data_od, :data_do) d \n" +
        "left join POKOJTYP pt on 1=1 \n" +
        "order by d.DATA, pt.POKOJTYP_NAZWA",
        nativeQuery = true)
List<Object[]> getDostepnoscNaTypy(
        @Param("data_od") Date dataOd,
        @Param("data_do") Date dataDo);

Отвечает ответ вашего метода getDostepnoscNaTypy(...) на List<DostepnoscTypyListDTO>

0 голосов
/ 02 июля 2018

Я изменил код на основе этого примера:

https://github.com/roberthunt/spring-data-native-query-projection/tree/master/src/main/java/uk/co/rbrt

Я создал проекционный интерфейс DostepnoscTypyListProjection.java:

public interface DostepnoscTypyListProjection {

    Date getNaDzien();
    Integer getPokojtypId();
    String getPokojtypNazwa();
    Integer getIleDostepnych();
}

и изменил RezerwacjaDao.java:

@Query(value = 
    "cast(d.DATA as Date) as naDzien, pt.POKOJTYP_ID as pokojtypId, pt.POKOJTYP_NAZWA as pokojtypNazwa, 10 as ileDostepnych \n" +
    "from LISTADAT(:data_od, :data_do) d \n" +
    "left join POKOJTYP pt on 1=1 \n" +
    "order by d.DATA, pt.POKOJTYP_NAZWA",
    nativeQuery = true)
List<DostepnoscTypyListProjection> getDostepnoscNaTypy(
        @Param("data_od") Date dataOd,
        @Param("data_do") Date dataDo);

В других файлах я изменил DostepnoscTypyListDTO на DostepnoscTypyListProjection, и все работает нормально.

0 голосов
/ 01 июля 2018

Необходимо указать, как сопоставить ответ, который БД возвращает, с нужным объектом.

Собственные запросы по умолчанию возвращают Object [], и его необходимо сопоставить вашему классу. Проверьте этот другой пост: Возврат пользовательского объекта из данных Spring с собственным запросом

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