解決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的時候,會報錯
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的時候,查詢的是count(ppd),查詢文檔得知默認(rèn)情況下,jpa會在執(zhí)行查詢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參數(shù)
解決問題~
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 就可以了
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring Boot 定制HTTP消息轉(zhuǎn)換器
本篇文章主要介紹了詳解Spring Boot 定制HTTP消息轉(zhuǎn)換器,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11Java二維數(shù)組與動態(tài)數(shù)組ArrayList類詳解
這篇文章主要給大家介紹了關(guān)于Java二維數(shù)組與動態(tài)數(shù)組ArrayList類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Spring條件注解@ConditionnalOnClass的原理分析
這篇文章主要介紹了Spring條件注解@ConditionnalOnClass的原理分析,所謂@ConditionalOnClass注解,翻譯過來就是基于class的條件,它為所標(biāo)注的類或方法添加限制條件,當(dāng)該條件的值為true時,其所標(biāo)注的類或方法才能生效,需要的朋友可以參考下2023-12-12Java設(shè)計(jì)模式中單一職責(zé)原則詳解
這篇文章主要介紹了Java設(shè)計(jì)模式中單一職責(zé)原則詳解,單一職責(zé)原則 (SRP) 是軟件設(shè)計(jì)中的一個重要原則,它要求每個類只負(fù)責(zé)一個職責(zé),需要的朋友可以參考下2023-05-05Spring基于Aop實(shí)現(xiàn)事務(wù)管理流程詳細(xì)講解
這篇文章主要介紹了Spring基于Aop實(shí)現(xiàn)事務(wù)管理流程,事務(wù)管理對于企業(yè)應(yīng)用來說是至關(guān)重要的,即使出現(xiàn)異常情況,它也可以保證數(shù)據(jù)的一致性,感興趣想要詳細(xì)了解可以參考下文2023-05-05通過Java 程序獲取Word中指定圖片的坐標(biāo)位置
本文介紹通過Java程序獲取Word文檔中指定圖片的坐標(biāo)位置,程序運(yùn)行環(huán)境是jdk1.8開發(fā)環(huán)境idea,通過java程序代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2021-05-05IDEA2022 提示更新 TKK失敗請檢查網(wǎng)絡(luò)連接的問題
這篇文章主要介紹了IDEA2022 提示:更新 TKK 失敗,請檢查網(wǎng)絡(luò)連接,本文給大家分享解決方案,對idea2022提示更新TKK失敗感興趣的朋友跟隨小編一起看看吧2022-11-11