方式一:使用@Query注解方式查詢主要有JPQL方式,也就是面向對象的方式,這種情況下查表其實查的是對象,字段是實體中的屬性,該方式可以直接映射到實體,如下圖。
使用jpql的方式模糊查詢時候不能使用if(?3 != '', e.originalIp like %?3%, 1=1)判斷空值,所以只能使用原生sql寫法。
坑點一:如果實體中包含timestamp類型是無法映射成功的,會報異常不能分配給構造,這個很坑很坑,找了一天的問題,解決方式將timestamp類型改為java.util包下的Date類型即可。
方式二: 使用@Query注解方式查詢也可以用原生sql的方式,該方式和我們在數據庫寫sql是一樣的,對應的是表名,字段,該方式不能直接映射到實體,使用該方式只需要在注解中加入nativeQuery = true即可。
使用該方式可以使用if(?3 != '', e.originalIp like %?3%, 1=1)判斷空值,但是不能直接映射到DTO,實現方式推薦使用實體定義成接口形式,只需要有get方法即可,注意命名要規范(JPA生成了該接口的代理類,支持直接序列化為json串),如下圖,該方式可以用HQL查詢,也可以用原生SQL查詢,LEnvfilehistoryDto2是一個接口,這里返回的是JPA生成的YyyDto的代理類。
坑點二:屬性一定要跟sql中字段對應好,如果字段中有_,結果不會自動駝峰映射,所以必須使用as起別名,避免下划線。
坑點三:模糊查詢時候使用if(?1!='',h.final_state = ?1,1=1)判斷空值,如果參數是integer類型,如果前台傳0,則對應sql為if(0!='',h.final_state = 0,1=1),這個時候查詢並不會按等於0去匹配,而是查詢所有,解決方案為將integer類型轉換為string類型傳入比較,即if('0'!='',h.final_state = '0',1=1)即可。
springdata jpa重要知識點
(1)可以通過自定義的 JPQL 完成 UPDATE 和 DELETE 操作。 注意: JPQL 不支持使用 INSERT;
(2)在 @Query 注解中編寫 JPQL 語句, 但必須使用 @Modifying 進行修飾. 以通知 SpringData, 這是一個 UPDATE 或 DELETE 操作
(3)UPDATE 或 DELETE 操作需要使用事務,此時需要定義 Service 層,在 Service 層的方法上添加事務操作;
(4)默認情況下, SpringData 的每個方法上有事務, 但都是一個只讀事務。 他們不能完成修改操作。