解決springdataJPA對原生sql支持的問題
springdataJPA對原生sql支持問題
在項(xiàng)目中用到的是springdataJPA連接數(shù)據(jù)庫進(jìn)行操作,但是JPA中的hql語句不能夠滿足業(yè)務(wù)要求,因而需要用到原生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);
在用這個sql的時(shí)候,會報(bào)錯
java.sql.SQLSyntaxErrorException: Unknown column 'ppd' in 'field list'
意思就是找不到ppd的字段,可是這里明顯可以看出ppd是別名
后查看項(xiàng)目啟動查詢數(shù)據(jù)調(diào)用的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 )
這里就發(fā)現(xiàn)了問題所在,在項(xiàng)目執(zhí)行sql的時(shí)候,查詢的是count(ppd),查詢文檔得知默認(rèn)情況下,jpa會在執(zhí)行查詢sql的時(shí)候會加上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參數(shù)
解決問題~
Spring Data JPA 寫原生sql語句
在使用 Spring Data JPA 的時(shí)候,通常我們只需要繼承 JpaRepository 就能獲得大部分常用的增刪改查的方法。有時(shí)候我們需要自定義一些查詢方法,可以寫自定義 HQL 語句
但是在使用 Spring Data JPA 的時(shí)候,通常我們只需要繼承 JpaRepository 就能獲得大部分常用的增刪改查的方法。有時(shí)候我們需要自定義一些查詢方法,可以寫自定義 HQL 語句
@Query(value = "自定義sql語句", nativeQuery = true) List<Long> findFriendsByUserId(Long userId);
如上,只需在查詢語句后邊加上nativeQuery = true 就可以了
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合EasyExcel實(shí)現(xiàn)Excel表格導(dǎo)出功能
這篇文章主要介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)Excel表格導(dǎo)出功能,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07
java實(shí)現(xiàn)聯(lián)機(jī)五子棋
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)聯(lián)機(jī)五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
java基于雙向環(huán)形鏈表解決丟手帕問題的方法示例
這篇文章主要介紹了java基于雙向環(huán)形鏈表解決丟手帕問題的方法,簡單描述了丟手帕問題,并結(jié)合實(shí)例形式給出了Java基于雙向環(huán)形鏈表解決丟手帕問題的步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
MyBatis 執(zhí)行動態(tài) SQL語句詳解
大家對mybatis執(zhí)行任意sql語句都了解,那么MyBatis執(zhí)行動態(tài)SQL語句呢?下面腳本之家小編給大家解答下mybatis執(zhí)行動態(tài)sql語句的方法,非常不錯,感興趣的朋友參考下吧2016-08-08
詳解Java Callable接口實(shí)現(xiàn)多線程的方式
這篇文章主要介紹了詳解Java Callable接口實(shí)現(xiàn)多線程的方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

