解決springdataJPA對原生sql支持的問題
springdataJPA對原生sql支持問題
在項目中用到的是springdataJPA連接數(shù)據(jù)庫進行操作,但是JPA中的hql語句不能夠滿足業(yè)務要求,因而需要用到原生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是別名
后查看項目啟動查詢數(shù)據(jù)調用的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)了問題所在,在項目執(zhí)行sql的時候,查詢的是count(ppd),查詢文檔得知默認情況下,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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java二維數(shù)組與動態(tài)數(shù)組ArrayList類詳解
這篇文章主要給大家介紹了關于Java二維數(shù)組與動態(tài)數(shù)組ArrayList類的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
Spring條件注解@ConditionnalOnClass的原理分析
這篇文章主要介紹了Spring條件注解@ConditionnalOnClass的原理分析,所謂@ConditionalOnClass注解,翻譯過來就是基于class的條件,它為所標注的類或方法添加限制條件,當該條件的值為true時,其所標注的類或方法才能生效,需要的朋友可以參考下2023-12-12
IDEA2022 提示更新 TKK失敗請檢查網(wǎng)絡連接的問題
這篇文章主要介紹了IDEA2022 提示:更新 TKK 失敗,請檢查網(wǎng)絡連接,本文給大家分享解決方案,對idea2022提示更新TKK失敗感興趣的朋友跟隨小編一起看看吧2022-11-11

