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

相关文章
相关标签/搜索