本周需要写一个根据文章标题获取文章的接口,很多文章的标题都使用了空格做分隔符号,但是在查询的时候一般都不会把空格加上的。所以需要在查询的时候把空格去除。本来想用jpa自动生成查询的,但是找了找没发现去除空格的方法,只能自己动手了。
JPA支持的关键字:
自定义语句
既然jpa没有提供,那我们就手写语句。如果只需要去除左右两端的空格,使用TRIM
函数,如果需要去除所有的空格,通过使用mysql的REPLACE
方法,将所有的空格符去除掉,再进行比对:
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
}
感谢张喜硕学长的帮助!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。