本週須要寫一個根據文章標題獲取文章的接口,不少文章的標題都使用了空格作分隔符號,可是在查詢的時候通常都不會把空格加上的。因此須要在查詢的時候把空格去除。原本想用jpa自動生成查詢的,可是找了找沒發現去除空格的方法,只能本身動手了。mysql
JPA支持的關鍵字:
![]()
![]()
既然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