2016-08-18 45 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,。

相關問題