# Spring Data JPA
###### tags: `jpa` `spring`
## Data Access Object<SUB>(資料存取物件/数据访问对象)</SUB>
### 以 method 名稱建立查詢<SUB>([出處](https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation "Query creation from method names"))</SUB>
| | JPQL |
| --------------------------- | -------------------------------------- |
| `find`**`Distinct`**`ByColumn` | `SELECT DISTINCT ... WHERE e.column = ?1` |
| `findByColumn1`**`And`**`Column2` | `WHERE e.column1 = ?1 AND e.column2 = ?1` |
| `findByColumn`**`IgnoreCase`** | `WHERE UPPER(e.column) = UPPER(?1)` |
### 使用 JPA Named Queries
```java
@Entity
@NamedQuery(name = "Something.findByColumn",
query = "SELECT s FROM Something s where u.emailAddress = ?1")
public class User {
}
```
### Specifications
```java
public class CustomerSpecs {
public static Specification<Customer> isLongTermCustomer() {
return new Specification<Customer>() {
public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
LocalDate date = new LocalDate().minusYears(2);
return builder.lessThan(root.get(_Customer.createdAt), date);
}
};
}
public static Specification<Customer> hasSalesOfMoreThan(MonetaryAmount value) {
return new Specification<Customer>() {
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
// build query here
}
};
}
}
```