解决springdataJPA对原生sql支持的问题

springdataJPA对原生sql支持问题

在项目中用到的是springdataJPA连接数据库进行操作,但是JPA中的hql语句不能够满足业务要求,因而需要用到原生sql

但是有一个问题:

@Query(value = "SELECT ppd.* FROM zt_productionplandetails AS ppd \n" + " \tLEFT JOIN zt_salesplan sp ON sp.id=ppd.salesPlan_id \n" + " \tLEFT JOIN zt_employee e ON e.id=ppd.employeeId\n" + " \tWHERE ppd.enabled = TRUE \n" + " \tAND ppd.`status`=1 \n" + "\tAND IF(:clientName !='', sp.clientName LIKE %:clientName%, 1 = 1 )\n" + " \tAND IF( :productName !='', sp.productName LIKE %:productName%, 1 = 1 )\n" + " \tAND IF( :empName != '', e.name LIKE %:empName%, 1 = 1 )\n" + " \tAND IF( :startDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=:startDate, 1 = 1 )\n" + " \tAND IF( :endDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=:endDate, 1 = 1 )" ,nativeQuery = true) Page<ProductionPlanDetails> findNewPlan(@Param("productName") String productName, @Param("empName") String empName, @Param("endDate") String endDate, @Param("startDate") String startDate, @Param("clientName") String clientName, Pageable pageable);

解决springdataJPA对原生sql支持的问题

在用这个sql的时候,会报错

java.sql.SQLSyntaxErrorException: Unknown column 'ppd' in 'field list'

意思就是找不到ppd的字段,可是这里明显可以看出ppd是别名

后查看项目启动查询数据调用的sql为:

select count(ppd) FROM zt_productionplandetails AS ppd LEFT JOIN zt_salesplan sp ON sp.id=ppd.salesPlan_id LEFT JOIN zt_employee e ON e.id=ppd.employeeId WHERE ppd.enabled = TRUE AND ppd.`status`=1 AND IF(? !='', sp.clientName LIKE ?, 1 = 1 ) AND IF( ? !='', sp.productName LIKE ?, 1 = 1 ) AND IF( ? != '', e.name LIKE ?, 1 = 1 ) AND IF( ? != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=?, 1 = 1 ) AND IF( ? != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=?, 1 = 1 )

这里就发现了问题所在,在项目执行sql的时候,查询的是count(ppd),查询文档得知默认情况下,jpa会在执行查询sql的时候会加上count()

所以做以下修改:

@Query(value = "SELECT ppd.* FROM zt_productionplandetails AS ppd \n" + " \tLEFT JOIN zt_salesplan sp ON sp.id=ppd.salesPlan_id \n" + " \tLEFT JOIN zt_employee e ON e.id=ppd.employeeId\n" + " \tWHERE ppd.enabled = TRUE \n" + " \tAND ppd.`status`=1 \n" + "\tAND IF(:clientName !='', sp.clientName LIKE %:clientName%, 1 = 1 )\n" + " \tAND IF( :productName !='', sp.productName LIKE %:productName%, 1 = 1 )\n" + " \tAND IF( :empName != '', e.name LIKE %:empName%, 1 = 1 )\n" + " \tAND IF( :startDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=:startDate, 1 = 1 )\n" + " \tAND IF( :endDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=:endDate, 1 = 1 )", countQuery = "SELECT count(*) FROM zt_productionplandetails AS ppd \n" + " \tLEFT JOIN zt_salesplan sp ON sp.id=ppd.salesPlan_id \n" + " \tLEFT JOIN zt_employee e ON e.id=ppd.employeeId\n" + " \tWHERE ppd.enabled = TRUE \n" + " \tAND ppd.`status`=1 \n" + "\tAND IF(:clientName !='', sp.clientName LIKE %:clientName%, 1 = 1 )\n" + " \tAND IF( :productName !='', sp.productName LIKE %:productName%, 1 = 1 )\n" + " \tAND IF( :empName != '', e.name LIKE %:empName%, 1 = 1 )\n" + " \tAND IF( :startDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) >=:startDate, 1 = 1 )\n" + " \tAND IF( :endDate != '', DATE_FORMAT(ppd.createDate, '%Y-%m-%d %k:%i:%s' ) <=:endDate, 1 = 1 )" ,nativeQuery = true)

加上countQuery参数

解决问题~

Spring Data JPA 写原生sql语句

在使用 Spring Data JPA 的时候,通常我们只需要继承 JpaRepository 就能获得大部分常用的增删改查的方法。有时候我们需要自定义一些查询方法,可以写自定义 HQL 语句

但是在使用 Spring Data JPA 的时候,通常我们只需要继承 JpaRepository 就能获得大部分常用的增删改查的方法。有时候我们需要自定义一些查询方法,可以写自定义 HQL 语句

@Query(value = "自定义sql语句", nativeQuery = true) List<Long> findFriendsByUserId(Long userId);

如上,只需在查询语句后边加上nativeQuery = true 就可以了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧。

发布于 2021-06-11 21:16:49
收藏
分享
海报
0 条评论
160
上一篇:React中的Context应用场景分析 下一篇:Spring,Data,JPA中,in,条件参数的传递方式
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码