# Specification 實務應用
[TOC]
###### tags: `spring` `jpa` `specification`
---
## `greaterThan()`<SUP>大於</SUP>
```java=
public static Specification<EntityClass> weightGreaterThan(float weight) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.greaterThan(
root.get(EntityClass_.weight),
weight
);
};
}
```
## `greaterThanOrEqualTo()`<SUP>大於等於</SUP>
```java=
public static Specification<EntityClass> weightGreaterThanOrEqualTo(float weight) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.greaterThanOrEqualTo(
root.get(EntityClass_.weight),
weight
);
};
}
```
## `lessThan()`<SUP>小於</SUP>
```java=
public static Specification<EntityClass> heightLessThan(double height) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.lessThan(
root.get(EntityClass_.height),
height
);
};
}
```
## `lessThanOrEqualTo()`<SUP>小於等於</SUP>
```java=
public static Specification<EntityClass> heightLessThanOrEqualTo(double height) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.lessThanOrEqualTo(
root.get(EntityClass_.height),
height
);
};
}
```
## `equal`<SUP>等於</SUP>
```java=
public static Specification<EntityClass> amountEqual(int amount) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.equal(
root.get(EntityClass_.amount),
amount
);
};
}
```
`equal()`也可應用在其它資料型態;如…
### 字符串
```java=
public static Specification<EntityClass> nicknameEqual(String string) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.equal(
root.get(EntityClass_.nickname),
string
);
};
}
```
### 布林
```java=
public static Specification<EntityClass> verified() {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.equal(
root.get(EntityClass_.verified),
true
);
};
}
```
### 列舉
```java=
public static Specification<EntityClass> categoryEqual(Category category) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.equal(
root.get(EntityClass_.category),
category
);
};
}
```
### 其它 entity class
```java=
public static Specification<EntityClass> classificationEqual(Classification classification) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.equal(
root.get(EntityClass_.classification),
classification
);
};
}
```
## `not()`
```java=
public static Specification<EntityClass> classificationNot(Classification classification) {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.not(
classificationEqual(classification)
);
};
}
```
## `isNull()`
```java=
public static Specification<EntityClass> classificationNull() {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.isNull(
root.get(EntityClass_.classification)
);
};
}
```
## `isNotNull()`
```java=
public static Specification<EntityClass> classificationNull() {
return (root, criteriaQuery, criteriaBuilder) -> {
return criteriaBuilder.isNotNull(
root.get(EntityClass_.classification)
);
};
}
```
## `LIKE`
## 多個條件
```java=
public static Specification<Entity> nickname(String nickname) {
return (root, criteriaQuery, criteriaBuilder) -> {
criteriaQuery.orderBy(
criteriaBuilder.desc(
root.get(Lover_.active)
)
);//以活跃降幂排序
return criteriaBuilder.and(
criteriaBuilder.equal(
root.get(Entity_.nickname),
string
),//未封号
criteriaBuilder.equal(
root.get(Lover_.gender),
gender
),//性别
criteriaBuilder.isTrue(
root.get(Lover_.relief)
)//通过安心认证
);
};
}
```
參考資料:
* [Spring Data JPA - Combining multiple Specifications](https://www.logicbig.com/tutorials/spring-framework/spring-data/combined-specifications.html)
* [Spring data jpa Specification 子查詢實現](https://www.twblogs.net/a/5d03a246bd9eee47d34bb920)