@Query註解的原生用法和native用法解析
@Query註解的原生用法和native用法
1. @Query原生用法
@Query(value = "select u.id, u.name from User u, town t where u.id = t.id and t.place =:name") User findUserByPlace(@Param("place") String place); @Query(value = "select new User(u.id, u.name) from User u, town t where u.id = t.id and t.place = ?1") User UsergetUserByPlace(String place);
上面兩個方法的效果是一樣的,這是原生方法。
2. @Query的native查詢用法
@Query(value="select * from user u, town t where u.id = t.id and t.place = ?1", nativeQuery = true) User UsergetUserByPlace(String place);
@Query的native的查詢方法要增加nativeQuery = true,默認是false,這樣查詢的時候就是使用原生的sql語句進行查詢數據庫的操作。
有nativeQuery = true和沒有的區別
有nativeQuery = true時
是可以執行原生sql語句,所謂原生sql,也就是說這段sql拷貝到數據庫中,然後把參數值給一下就能運行瞭,比如:
@Query(value = "select * from product_rel where audit_id=?1 and process_object=0 ",nativeQuery = true) List<ProductRel> findAllByProductAuditId(Integer id);
這個時候,把select * from product_rel where audit_id=?1 and process_object=0拷貝到數據庫中,並給audit_id賦一個值,那麼這段sql就可以運行。其中數據庫表在數據庫中的表名就是product_rel,字段audit_id在數據庫中也是真實存在的字段名。
沒有nativeQuery = true時
就不是原生sql,而其中的select * from xxx中xxx也不是數據庫對應的真正的表名,而是對應的實體名,並且sql中的字段名也不是數據庫中真正的字段名,而是實體的字段名。例如:
@Query("select ratio from MdmRatio ratio where enabledNum=1 ") List<MdmUtilThreeProjection> findByMdmUtilThreeProjection();
此中,select ratio from MdmRatio ratio 中的MdmRatio為實體名,不是真正的數據庫表名,真正的數據庫表名是mdm_ratio(如上圖@Table裡面寫的那樣,MdmRatio實體對應的數據庫表名是mdm_ratio。
但不一定都是這樣的,可能你的MdmRatio實體對應的數據庫表是mdm_ratio_abc,但whatever,隨便是什麼,隻要它真實存在就Ok),而查詢條件中的enabledNum在數據庫中真正的名字是enabled_num。
這兩個的作用是一樣的,隻是寫法不同而已。涉及到HQL的知識。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- spring boot中nativeQuery的用法
- SpringDataJpa的@Query註解報錯的解決
- Springboot JPA如何使用distinct返回對象
- SpringData JPA的常用語法匯總
- spring data jpa @Query註解中delete語句報錯的解決