# fluent-jpa
**Repository Path**: xiezengcheng/fluent-jpa
## Basic Information
- **Project Name**: fluent-jpa
- **Description**: 简化JPA的查询语句,封装Specification,轻松构建JPA条件查询
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 0
- **Created**: 2022-04-15
- **Last Updated**: 2023-10-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: Java, JPA, SpringBoot, Hibernate
## README
# fluent-jpa
#### 介绍
fluent-jpa是JpaSpecificationExecutor中Specification增强工具包,简化查询操作,对Specification进行了很好的封装。
* 支持通过注解@Query查询
* 支持灵活的自定义Wrapper查询
* 支持复杂的Join操作(不推荐)(推荐使用Fluent-Mybatis)
#### 参数说明
|字段名称 |字段描述| 默认值|
| ------------ | -------------------|-------|
|propName| 对象的属性名,如果字段名称与实体字段一致,则可以省略 |""|
|type| 查询方式,默认为 |EQUAL|
|blurry |多字段模糊查询,值为实体字段名称| {}|
|joinName| 关联实体的属性名称| ""|
|join| 连接查询方式,左连接或者右连接| LEFT|
#### 快速开始
###### 1. pom.xml 引入依赖
```
com.gitee.xiezengcheng
fluent-jpa
1.1.1
```
###### 2. 创建 JPA 实体类
```
@Entity
@Data
@Table(name = "sys_quartz_log")
public class QuartzJobLog implements Serializable {
@Id
@Column(name = "log_id")
@ApiModelProperty(value = "ID", hidden = true)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ApiModelProperty(value = "任务名称", hidden = true)
@Column(name = "job_name")
private String jobName;
@ApiModelProperty(value = "bean名称", hidden = true)
private String beanName;
@ApiModelProperty(value = "方法名称", hidden = true)
private String methodName;
@ApiModelProperty(value = "参数", hidden = true)
private String params;
@ApiModelProperty(value = "执行耗时", hidden = true)
private Long time;
@CreationTimestamp
@ApiModelProperty(value = "创建时间", hidden = true)
private Timestamp createTime;
}
```
###### 3. 创建JpaRepository 继承JpaSpecificationExecutor
```
public interface QuartzJobLogRepository extends
JpaRepository, JpaSpecificationExecutor {
}
```
###### 4. 创建查询条件类
```
@Getter
@Setter
public class QuartzJobLogQuery extends AndSpecification {
@Query(type = Query.Type.LESS_THAN_EQ)
private Long id;
@Query(type = Query.Type.IN,propName = "id")
private List idList;
@Query(type = Query.Type.INNER_LIKE,propName = "beanName")
private String beanName;
@Query(blurry = {"methodName","jobName","beanName"})
private String methodName;
private String jobName;
}
```
###### 5. Specification说明
|类 |字段描述|
| ------------ | -------------------|
|AndSpecification| 所有查询条件用and连接 where bean_name=1 and method_name=2 |
|OrSpecification| 所有查询条件用or连接 where bean_name=1 or method_name=2 |
######6. 通过Reposiory查询
```$xslt
List quartzJobLogs = quartzJobLogRepository.findAll(quartzJobLogQuery);
```
```$xslt
public interface JpaSpecificationExecutor {
Optional findOne(@Nullable Specification spec);
List findAll(@Nullable Specification spec);
Page findAll(@Nullable Specification spec, Pageable pageable);
List findAll(@Nullable Specification spec, Sort sort);
long count(@Nullable Specification spec);
}
```
######7. 构建Wrapper查询
```$xslt
PredicateOrWrapper orWrapper = new PredicateOrWrapper<>();
orWrapper.in(QuartzJobLog::getId, quartzJobLogQuery.getIdList());
PredicateAndWrapper andWrapper = new PredicateAndWrapper<>();
andWrapper.innerLike(QuartzJobLog::getBeanName, quartzJobLogQuery.getBeanName());
andWrapper.innerLike(QuartzJobLog::getJobName, quartzJobLogQuery.getJobName());
orWrapper.or(andWrapper);
// select * from sys_quartz_log where id in() or (bean_name like %?% and job_name like %?%)
List quartzJobList = quartzJobLogRepository.findAll(orWrapper.build());
```
###### 8. Wrapper说明
|类 |字段描述|
| ------------ | -------------------|
|AndWrapper| 所有查询条件用and连接 where bean_name=1 and method_name=2 |
|OrWrapper| 所有查询条件用or连接 where bean_name=1 or method_name=2 |
###### 9. QueryHelper使用
```$xslt
List all = quartzJobRepository.findAll(((root, query, criteriaBuilder) -> QueryHelper.toPredicate(root, quartzJobQuery, criteriaBuilder)));
```
###### 10. 关于Join
支持Join查询,但不推荐使用,可以考虑分开查询
```
1 注解查询
1.1 在实体类添加关联信息
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "job_id")
private QuartzJob quartzJob;
1.2 在查询类上添加查询条件
// joinName即实体类中关联的属性名 propName即QuartzJob中的id属性名
@Query(joinName = "quartzJob", propName = "id", join = Query.Join.LEFT)
private Long quartzId;
2. Wrapper查询
参数和注解查询相同,暂时只考虑这样,因为用的少,推荐使用Fluent-Mybatis
public PredicateWrapper join(SerializableFunction joinName, SerializableFunction propName, R value, com.gitee.xiezengcheng.fluent.jpa.annotation.Query.Join join, Type type) {
this.list.add(Query.build(type, ReflectionUtil.getFieldName(propName), value, join, ReflectionUtil.getFieldName(joinName)));
return this;
}
```