2016-08-18 43 views
1

这就是我要做的,是否可以在运行时在Spring Boot中创建自定义查询?

我有一个实体,

@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="" 

这些PARAMS不应该被强迫要求,并可以很容易地使用其中的任何做查询,像

/search?createTime=""... 

有一种优雅这种方式来实现?

+0

有很多方法。用g00glen00b假设的标准api就是一个好处。其他可能是创建定制存储库实现并使用jdbctemplate根据输入参数获取结果。 – bilak

回答

2

你可以使用Spring的规范API,这是一个包装到JPA标准API工作。确保您的存储库扩展从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时没有项目代码/作业类型/ ...给出这样它会被忽略的查询。

现在你可以使用这个:

repository.findAll(Specifications.where(JobEntitySpecifications.withJobType(jobType)) 
    .and(JobEntitySpecifications.withJobStatus(jobStatus)) 
    .and(JobEntitySpecifications.withProject(project)) 
    .and(JobEntitySpecifications.withCreateTime(createTime))); 

你可以使它看起来更好,如果你在这里使用静态导入。

+0

这个很好用!谢谢 –

0

虽然不能确定动态生成的查询,认为会吃掉建立机制不同查询的时间。

Elastic Search这有助于建立这样的。

其中一个方式是默认的查询值。由于所有的值其余的都是枚举,你可以添加其他枚举字面到每个枚举作为ALL

Project.ALL, JobType.ALL, JobStatus.ALL。枚举中的内部静态方法应该如此编写,当查询ALL时,将所有JobTypes/Project/JobStatus添加到列表中。

可写的,而不是在飞行建筑查询一个单一的标准查询。就缓存查询结果而言,API很容易。

最像的一个/search?project=""&jobType=""&jobStatus=""&createTime=""作品上违约搜索REST的API,。

相关问题