聊聊Spring|聊聊Spring data jpa @query使用原生SQl,需要注意的坑
目录
- Spring data jpa @Query 使用原生Sql的坑
- 根据代码来解说:
- 需要注意的方法有以下几点
- SpringData JPA @Query动态SQL语句
- 思路
- 实现
Spring data jpa @Query 使用原生Sql的坑
根据代码来解说:
@Query(value = "https://www.it610.com/article/select bill.id_ as id, bill.created_date as date, bill.no, lawyer_case .case_no as caseNo," +"lawyer_case .case_name as caseName, customer.no as customerNo, customer.cn_name as customerName, " +"bill.total_expense_after_tax, bill.collected_money, bill.book_ticket_amount, bill.version " +"e1.name as creator, bill.status" +"from bill " +"left join lawyer_case on lawyer_case .case_no=bill.case_no " +"left join customer on customer.no=bill.customer_no " +"left join employee e1 on e1.id_=bill.creator " +"where IF (?1!='', customer_no=?1, 1=1) " +"andIF (?2!='', case_no=?2, 1=1) " +"andIF (?3!='', status=?3, 1=1) " +"andIF (?4!='', creator'%',?4,'%')), 1=1) " +"andcreate_by=?5 " +"ORDER BY ?#{#pageable} ",countQuery = "select count(*) " +"from bill " +"left join lawyer_case on lawyer_case .case_no=bill.case_no " +"left join customer on customer.no=bill.customer_no " +"left join employee e1 on e1.id_=bill.creator " +"where IF (?1!='', customer_no=?1, 1=1) " +"andIF (?2!='', case_no=?2, 1=1) " +"andIF (?3!='', status=?3, 1=1) " +"andIF (?4!='', creator'%',?4,'%')), 1=1) " +"andcreate_by=?5 "+"ORDER BY ?#{#pageable} ",nativeQuery = true)Page
需要注意的方法有以下几点
- 1、From 不支持重命名.
- 2、返回的是一个page
- 3、对于使用分页,需要:“ORDER BY ?#{#pageable}”,可以直接传入一个pageable对象,会自动解析。
- 4、注意格式问题,很多时候就是换行的时候,没有空格。
- 5、仔细对应数据库中表字段,很多时候报某个字段找不到,就是因为字段名写错,和数据库中对应不上。
- 6、这是解决使用微服务,大量的数据都需要远程调用,会降低程序的性能。
- 7、使用Pageabel作为参数的时候,去进行分页。刚开始的时候,觉得还是一个可行的办法,但是得注意的时候,当需要排序的时候,是无法加入sort字段的。 会一直报错left*。
- 8、针对7的解决方案,把原生SQL的数据查询和countQuery分成两个查询方法。得到count,然后进行判断,若是等于0,则直接返回空集合;反之,则取获取数据。 需要自己进行分页计算,传入正确的pageNumber和pageSize。
pageNumber的算法= (pageNumber - 1) * pageSize, 前提是PageNumber是从1开始,若0,则pageNumber=pageNumber * PageSize; 这样就可以保证数据的正确。
/*** pageInfos: 转换之后的数据。* pageable:传入的pageable.* totalPage: 第一条SQL算好的返回值。* 这样就可以统一的返回各种pageDTO。*/private PageconvertForPage(List pageInfos, Pageable pageable, Integer totalPage) {return new PageImpl<>(pageInfos, pageable, totalPage); }
SpringData JPA @Query动态SQL语句 这次有个需求,需要动态的sql语句去查询,但是@Query正常情况下SQL语句是写死的,在查找了很多资料后,想到了一个好的解决办法
思路
利用MYSQL的判断来拼接SQL语句
【聊聊Spring|聊聊Spring data jpa @query使用原生SQl,需要注意的坑】
实现
先上代码
@Query(value = "https://www.it610.com/article/select * from project_demand where project_id=?1 and if(?2!='',demand_id in (select demand_id from demand_user where user_id=?2),1=1)",nativeQuery = true)List getListByUser(String projectId,String userId);
文章图片
红色部分,就是生成动态SQL的方法,利用MYSQL的if函数和我们传递的参数去进行判断,然后获取SQL语句。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 2018-07-09|2018-07-09 Spring 的DBCP,c3p0
- 数据库总结语句
- 想聊聊SA,聊聊手帐,也想和你们分享自己
- spring|spring boot项目启动websocket
- Spring|Spring Boot 整合 Activiti6.0.0
- vue组件中为何data必须是一个函数()
- Spring集成|Spring集成 Mina