一直以为他俩是一样的,唯一的区别就是
mongo的repository继承的是MongoRepository
mysql的repository 继承的是JpaRepository
今天偶然间发现在模糊查询方面,也有着细微的差别
先说结论
mysql的需要手动加 %
mongo的不需要
首先是mongo的
public interface Mongodb_Domain_testRepository extends MongoRepository<Mongodb_Domain_test,String> {
public Page<Mongodb_Domain_test> findAllByNameLike(Pageable pageable,String name);
}
然后是mysql的
public interface Mysql_Entity_TestRepository extends JpaRepository<Mysql_Entity_Test,Integer> {
public Page<Mysql_Entity_Test> findAllByNameLike(Pageable pageable, String name);
}
方法名参数名一模一样,但是
mongo的模糊查询——》不需要加通配符
@Test
public void momgo_Repository_like(){
Pageable pageable=PageRequest.of(0,5);
Page<Mongodb_Domain_test> all = mongodb_domain_testRepository.findAllByNameLike(pageable, "g");
List<Mongodb_Domain_test> content = all.getContent();
System.out.println("all.getTotalElements() = " + all.getTotalElements());
System.out.println("all.getTotalPages() = " + all.getTotalPages());
for (Mongodb_Domain_test test : content) {
System.out.println(test);
}
}
mysql的模糊查询——》需要自己加通配符
@Test
public void mysql_Repository_like(){
List<Sort.Order>sortOrderList=new ArrayList<>();
sortOrderList.add(Sort.Order.desc("id"));
Pageable pageable=PageRequest.of(0,5,Sort.by(sortOrderList));
Page<Mysql_Entity_Test> all = testRepository.findAllByNameLike(pageable, "%l%");
// Page<Mysql_Entity_Test> all = testRepository.findAllByNameLike(pageable, "%l");
// Page<Mysql_Entity_Test> all = testRepository.findAllByNameLike(pageable, "l%");
// Page<Mysql_Entity_Test> all = testRepository.findAllByNameLike(pageable, "l");
System.out.println("getTotalElements-->"+all.getTotalElements());
System.out.println("getTotalPages-->"+all.getTotalPages());
List<Mysql_Entity_Test> content = all.getContent();
for (Mysql_Entity_Test mysql_entity_test : content) {
System.out.println("mysql_entity_test.getName() = " + mysql_entity_test.getName());
}
}
总结
/**
*
* Repository封装好的模糊查询——————》mysql的和mongodb的不一样
* mysql的like里面需要自己写匹配规则
* like(%zhang%) 还是
* like(%zhang) 还是
* like(zhang%)
* 但是 mongo里面的like 就不需要自己写 % 只需要写 like(zhang) 就默认是前后匹配
* findAllByNameEndingWith(zhang) 是 %zhang
* findAllByNameStartingWith(zhang) 是 zhang%
* 这里他们两个的不同
*
* */
另外
或许有人想过通过设置 example 的方式去模糊查询,举个例子:
User user=new User();
user.setName("%zh%");
findAll.(Example.of(user),pageable);
这样肯定是不行的,因为example就是准确查询,他会把 %zh% 当作一个整体去查询,而不是将 % 当作通配符去查询。