Spring 中带有 @Query 注释的本机查询
Native queries with @Query annotation in Spring
我在 Spring 中遇到本机查询问题。我在参数值中使用带有参数 nativeQuery=true 和 SQL 查询的注释 @Query。
我在文件 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;
}
}
您需要指定如何将数据库 return 的响应映射到您想要的对象。
默认情况下本机查询 return 对象[],它需要映射到您的 class。
检查其他 post:
您需要将查询的 return 类型更改为 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);
Ans 将您的方法 getDostepnoscNaTypy(...)
的响应转换为 List<DostepnoscTypyListDTO>
我根据这个例子修改了代码:
我创建了一个投影界面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,一切正常。
我在 Spring 中遇到本机查询问题。我在参数值中使用带有参数 nativeQuery=true 和 SQL 查询的注释 @Query。
我在文件 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;
}
}
您需要指定如何将数据库 return 的响应映射到您想要的对象。
默认情况下本机查询 return 对象[],它需要映射到您的 class。
检查其他 post:
您需要将查询的 return 类型更改为 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);
Ans 将您的方法 getDostepnoscNaTypy(...)
的响应转换为 List<DostepnoscTypyListDTO>
我根据这个例子修改了代码:
我创建了一个投影界面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,一切正常。