这就是我想做的
我有一个实体
@Entity public class JobEntity { @Id @GeneratedValue private Long id; @Enumerated(EnumType.STRING) private Project project; @Enumerated(EnumType.STRING) private JobType jobType; @Enumerated(EnumType.STRING) private JobStatus jobStatus; private Date createTime; }
我知道我可以自定义存储库中的一个查询,但这只是一个固定的查询。我希望导出一些RESTful API,如下所示,
/search?project=""&jobType=""&jobStatue=""&createTime=""
这些参数不是强制性的,可以轻松地使用它们中的任何一个进行查询,例如
/search?createTime=""...
是否有一种优雅的方法来实现这一目标?
您可以使用Spring的规范API,它是JPA标准API的包装。确保您的存储库从JpaSpecificationExecutor<JobEntity>
JpaSpecificationExecutor<JobEntity>
规范示例为:
public class JobEntitySpecifications { public static Specification<JobEntity> withProject(Project project) { if (project == null) { return null; } else { return (root, query, cb) -> cb.equal(root.get("project"), project); } } public static Specification<JobEntity> withJobType() { ... } public static Specification<JobEntity> withJobStatus() { ... } public static Specification<JobEntity> withCreateTime() { ... } }
确保null在没有给出项目代码/职位类型/ …的情况下返回,以便在查询中将其忽略。
null
现在您可以使用:
repository.findAll(Specifications.where(JobEntitySpecifications.withJobType(jobType)) .and(JobEntitySpecifications.withJobStatus(jobStatus)) .and(JobEntitySpecifications.withProject(project)) .and(JobEntitySpecifications.withCreateTime(createTime)));
如果在此处使用静态导入,则可以使其看起来更好。