jpa去除空格查詢

本週須要寫一個根據文章標題獲取文章的接口,不少文章的標題都使用了空格作分隔符號,可是在查詢的時候通常都不會把空格加上的。因此須要在查詢的時候把空格去除。原本想用jpa自動生成查詢的,可是找了找沒發現去除空格的方法,只能本身動手了。mysql

JPA支持的關鍵字:
image.png
image.png

自定義語句

既然jpa沒有提供,那咱們就手寫語句。若是隻須要去除左右兩端的空格,使用TRIM函數,若是須要去除全部的空格,經過使用mysql的REPLACE方法,將全部的空格符去除掉,再進行比對:sql

public interface ArticleRepository extends PagingAndSortingRepository<Article, Long>, JpaSpecificationExecutor {
    @Query(value = "SELECT * FROM article WHERE REPLACE(title,' ','')=?1", nativeQuery = true)
    Article findByTitle(String title);

}

進行測試:函數

@Test()
    public void test() {
       Article article =  articleRepository.findByTitle("RestwithSpring");
       logger.info(article.getTitle()); //  結果爲Rest with Spring
    }

增長查詢字段

考慮到此查詢方式可能屢次使用,爲了不每一個方法都手寫sql,想法是新增一個titleForQuery字段,專門保存去除空格後的標題。之後針對此字段進行查詢便可。問題就在於如何在保存和更新title字段的同步更新到titleForQuery字段。測試

咱們能夠經過實體生命週期完成此功能,jpa提供了 @PrePersist,@PreUpdate和@PreRemove三個事件來監聽實體的生命週期,咱們只須要在方法上邊使用對應的註解便可:this

@Entity
public classArticle  {
     ......
    
     /**
     * 用來查詢的標題
     * 去除空格 使用小寫
     */
    @Column(columnDefinition = "text")
    @JsonView(BaseJsonView.class)
    private String titleForQuery;
    
    @PrePersist
    @PreUpdate
    protected void prePersist() {
        this.titleForQuery =  title.toLowerCase().replaceAll("\\s*", "");
    }
}

在更新和保存的時候,把title轉成小寫並去除空格賦值給titleForQuery字段,這樣在查詢的時候就能夠針對titleForQuery作查詢了。進行測試,結果相同。spa

@Test()
    public void test() {
       Article article =  articleRepository.findByTitleForQuery("RestwithSpring");
       logger.info(article.getTitle()); //  結果爲Rest with Spring
    }

感謝張喜碩學長的幫助!3d

相關文章
相關標籤/搜索