【问题标题】:Native queries with @Query annotation in SpringSpring中带有@Query注解的本机查询
【发布时间】:2018-12-09 23:29:45
【问题描述】:

我在 Spring 中遇到原生查询问题。我在参数值中使用带有参数 nativeQuery=true 的注释 @Query 和 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;
    }
}

【问题讨论】:

    标签: java spring hibernate jpa nativequery


    【解决方案1】:

    我根据这个例子修改了代码:

    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,一切正常。

    【讨论】:

      【解决方案2】:

      您需要将查询的返回类型更改为List&lt;Object[]&gt;

      @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);
      

      Ans 将您的方法 getDostepnoscNaTypy(...) 的响应转换为 List&lt;DostepnoscTypyListDTO&gt;

      【讨论】:

        【解决方案3】:

        您需要指定如何将 DB 返回的响应映射到您想要的对象中。

        默认情况下,本机查询返回 Object[],它需要映射到您的类。 查看其他帖子:Return custom object from Spring Data with Native Query

        【讨论】:

          猜你喜欢
          • 2020-11-19
          • 2017-07-28
          • 2019-03-10
          • 2019-04-15
          • 1970-01-01
          • 2017-04-21
          • 2019-10-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多