@Query註解的用法(Spring Data JPA)
1. 一個使用@Query註解的簡單例子
@Query(value = "select name,author,price from Book b where b.price>?1 and b.price findByPriceRange(long price1, long price2);
2. Like表示式
@Query(value = "select name,author,price from Book b where b.name like %:name%") List findByNameMatch(@Param("name") String name);
3. 使用Native SQL Query
所謂本地查詢,就是使用原生的sql語句(根據資料庫的不同,在sql的語法或結構方面可能有所區別)進行查詢資料庫的操作。
@Query(value = "select * from book b where b.name=?1", nativeQuery = true) List findByName(String name);
4. 使用@Param註解注入引數
@Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price") List findByNamedParam(@Param("name") String name, @Param("author") String author, @Param("price") long price);
5. SPEL表示式(使用時請參考最後的補充說明)
'#{#entityName}'值為'Book'物件對應的資料表名稱(book)。
@Query(value = "select * from #{#entityName} b where b.name=?1", nativeQuery = true) List findByName(String name);
6. 一個較完整的例子
public interface BookQueryRepositoryExample extends Repository { @Query(value = "select * from Book b where b.name=?1", nativeQuery = true) List findByName(String name);// 此方法sql將會報錯(java.lang.IllegalArgumentException),看出原因了嗎,若沒看出來,請看下一個例子 @Query(value = "select name,author,price from Book b where b.price>?1 and b.price findByPriceRange(long price1, long price2); @Query(value = "select name,author,price from Book b where b.name like %:name%") List findByNameMatch(@Param("name") String name); @Query(value = "select name,author,price from Book b where b.name = :name AND b.author=:author AND b.price=:price") List findByNamedParam(@Param("name") String name, @Param("author") String author, @Param("price") long price); }
7. 解釋例6中錯誤的原因:
因為指定了nativeQuery = true,即使用原生的sql語句查詢。使用java物件'Book'作為表名來查自然是不對的。只需將Book替換為表名book。
@Query(value = "select * from book b where b.name=?1", nativeQuery = true) List findByName(String name);
補充說明(2017-01-12):
有同學提出來了,例子5中用'#{#entityName}'為啥取不到值啊?
先來說一說'#{#entityName}'到底是個啥。從字面來看,'#{#entityName}'不就是實體類的名稱麼,對,他就是。
實體類Book,使用@Entity註解後,spring會將實體類Book納入管理。預設'#{#entityName}'的值就是'Book'。
但是如果使用了@Entity(name = "book")來註解實體類Book,此時'#{#entityName}'的值就變成了'book'。
到此,事情就明瞭了,只需要在用@Entity來註解實體類時指定name為此實體類對應的表名。在原生sql語句中,就可以把'#{#entityName}'來作為資料表名使用。
相關文章
- Spring Data JPA REST Query CriteriaSpringREST
- Spring Data JPA 在 @Query 中使用投影的方法Spring
- Spring Data JpaSpring
- Spring Data JPA之Spring Data JPA快速入門(三)Spring
- Spring Data JPA 的使用Spring
- Spring Data Jpa APISpringAPI
- Spring Boot:整合Spring Data JPASpring Boot
- Spring Data JPA中TransactionInterceptorSpring
- Spring Data JPA中ConfigurableTransactionManagerSpring
- spring data jpa查詢Spring
- SpringBoot整合Spring Data JPASpring Boot
- Spring Data JPA:解析SimpleJpaRepositorySpring
- Spring Data JPA:解析CriteriaQuerySpring
- Spring Data JPA:解析CriteriaBuilderSpringUI
- Spring: @ModelAttribute註解用法Spring
- Spring Data JPA系列3:JPA專案中核心場景與進階用法介紹Spring
- Spring Data JPA簡單使用Spring
- Spring Data JPA原始碼案例Spring原始碼
- Spring Data JPA框架的Repository自定義實現詳解Spring框架
- Spring Data JPA的簡單入門Spring
- Spring 快取註解@Cacheable的用法Spring快取
- Spring Data JPA中事務ReactiveTransactionManagerSpringReact
- 一文搞定 Spring Data JPASpring
- Spring Data JPA 參考文件三Spring
- Spring Boot (五)Spring Data JPA 操作 MySQL 8Spring BootMySql
- 【Spring技術棧】初識Spring Data JPASpring
- 提高Spring Data JPA應用程式的效能Spring
- 解決Spring Data JPA Hibernate的N+1問題的最佳方法Spring
- Spring Data JPA專案實戰(下)Spring
- jpa @Query demo 演示
- Spring Data JPA(二):SpringBoot整合H2Spring Boot
- Spring Data JPA中事務超時TransactionTimedOutExceptionSpringException
- Spring Data JPA 實現聯表查詢Spring
- SpringBoot第九篇:整合Spring Data JPASpring Boot
- 使用Spring Data Jpa遇到問題彙總Spring
- spring-data-jpa使用快取的注意事項Spring快取
- spring data JPA 模糊查詢 --- 使用 LIKE --- 的寫法Spring
- 如何使用JPA的@Formula註解?ORM