【Spring Data 系列學習】Spring Data JPA @Query 註解查詢
阿新 • • 發佈:2020-03-15
# 【Spring Data 系列學習】Spring Data JPA @Query 註解查詢
前面的章節講述了 Spring Data Jpa 通過宣告式對資料庫進行操作,上手速度快簡單易操作。但同時 JPA 還提供通過註解的方式實現,通過將 `@Query` 註解在繼承 repository 的介面類方法上 。
**Query 原始碼講解**
```java
public @interface Query {
/**
* 指定 JPQL 的查詢語句。(nativeQuery = true)是原生的 SQL 語句.
*/
String value() default "";
/**
* 指定 count 的 JPQL 語句,如果不指定將根據 query 自動生成。
* (nativeQuery = true 的時候,是原生查詢的 SQL 語句)
*/
String countQuery() default "";
/**
*根據那個欄位來 count,一般預設即可。
*/
String countProjection() default "";
/**
* 預設是 false,表示 value 裡面是不是原生的 SQL 語句
*/
boolean nativeQuery() default false;
/**
* 可以指定一個 query 的名字,必須是唯一的。
* 如果不指定,預設的生成規則是
* {$domainClass}.${queryMethodName}
*/
String name() default "";
/**
* 可以指定一個 count 的query 名字,必須是唯一的。
* 如果不指定,預設的生成規則是:
* {$domainClass}.${queryMethodName}.count
*/
String countName() default "";
}
```
## 快速上手
**專案中的`pom.xml`、`application.properties`與 Chapter1 相同**
**實體類對映資料庫表**
**user 實體類**
```java
@Entity
@Table(name = "t_user")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "u_name")
private String name;
@Column(name ="u_age")
private Integer age;
@Column(name ="u_email")
private String email;
// 省略構造器 set/get
}
```
`@Entity`:定義物件將會成為被JPA管理的實體,將對映到指定的資料庫表。
`@Table` :指定資料庫的表名。
`@Column`:定義該屬性對應資料庫中的列名。
`@Id` 定義屬性為資料庫的主鍵,一個實體裡面必須有一個。
`@GeneratedValue(strategy = GenerationType.IDENTITY)` 自增長 ID 策略
生成如下:
![image-20200301143239501](https://img2020.cnblogs.com/other/1953867/202003/1953867-20200315202934545-943763075.png)
## @Query 查詢
### 基本使用
**繼承 UserQueryRepository**
```java
public interface UserQueryRepository extends JpaRe