jpa去除空格查询

本周需要写一个根据文章标题获取文章的接口,很多文章的标题都使用了空格做分隔符号,但是在查询的时候一般都不会把空格加上的。所以需要在查询的时候把空格去除。本来想用jpa自动生成查询的,但是找了找没发现去除空格的方法,只能自己动手了。

JPA支持的关键字:

jpa去除空格查询

jpa去除空格查询

自定义语句

既然jpa没有提供,那我们就手写语句。如果只需要去除左右两端的空格,使用 TRIM 函数,如果需要去除所有的空格,通过使用mysqlREPLACE 方法,将所有的空格符去除掉,再进行比对:

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 三个事件来监听实体的生命周期,我们只需要在方法上边使用对应的注解即可:

@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做查询了。进行测试,结果相同。

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

感谢张喜硕学长的帮助!

原文 

https://segmentfault.com/a/1190000022095630

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » jpa去除空格查询

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址