比如:有时候有个字段是有值的,有时候又是没值的。究竟怎么查询!!!
@Query(),就是无法达到想要的结果。
比如需求如下:前台搜索,如果不写搜索条件,那么就不过滤,查询所有;若有写搜索条件,则按条件查询。
即mongo DB的like查询。
那么,就需要在同等的条件下,写个多条件的组合查询,这个时候,就得用Java 中 mongodb的各种操作 模糊查询 精确查询 啦。如下,简单示范:
在springMVC中如何实现复杂的组合查询。
同时也有简单的例子,可以直接在@Query()里面完成的简单查询。
先是通常都有一个文件实现mongo数据库的接口MongoRepository< ,>,
具体如下,我的多实现了一个接口:剧情需要。
import com.xxx.x.model.self.Module;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* 模块 Module
*/
@Repository("moduleRepository")
public interface ModuleRepository extends MongoRepository<Module, String>, ModuleRepositoryCustom {
/**
* 根据模块名称查找所有
*/
@Query("{'name':?0}")
List<Module> findAllByName(String name);
/**
* 查找除id以外的其他所有
*/
@Query("{'id':{'$ne':?0}}")
List<Module> findAllExceptId(String id);
/**
* 根据模块id查找
*/
@Query("{'id':?0}")
Module findById(String id);
}
如上:Module,是一个用来存储在mongo数据库的一个表的一个Java bean。
@Repository("moduleRepository")-这个就是在数据库有个表名叫:moduleRepository的表,具体实现由springMVC的注解给自动实现的。
可以看引入的文件的,就知道这是框架自带的。
上面代码,就有一些简单的@Query()的使用方法。下面再看自己定义的一个接口文件,也是上面一起实现的那个接口的代码:
import java.util.*;
/**
* 模块
*/
public interface ModuleRepositoryCustom {
Map<String, Object> findModuleBySearcher(Map<String, Object> result, int pageNo, int pageSize, String module);
}
简单,就是个接口,里面啥都没有。
下面再看,上面自定义的接口的实现类。
import com.xxx.x.model.self.Module;
import com.google.common.base.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
import java.util.Map;
/**
* 模块
*/
public class ModuleRepositoryImpl implements ModuleRepositoryCustom {
@Autowired
private MongoTemplate mongoTemplate;
public Map<String, Object> findModuleBySearcher(Map<String, Object> result, int pageNo, int pageSize, String module) {
Criteria criteria = new Criteria();
if (!Strings.isNullOrEmpty(module)) {
criteria.orOperator(Criteria.where("name").regex(".*?" + module + ".*"));
}
Query query = new Query(criteria);
query.skip((pageNo - 1) * pageSize);
query.limit(pageSize);
query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "name")));
List<Module> modules = this.mongoTemplate.find(query, Module.class);
long count = this.mongoTemplate.count(query, Module.class);
result.put("recordsTotal", count);
result.put("recordsFiltered", count);
result.put("data", modules);
return result;
}
}
mongoTemplate:这个属性,是 springMVC框架自带的吧,可能大家的项目取的名字不一样。
无视上面的result内容,只需要看到那个modules的返回结果,就可以啦。
然后再看,这个扩展的查询语句是怎么在service层使用的:
/**
* 分页查询展示数据
*
* @param result 返回数据集合
* @param pageNo 分页页面
* @param pageSize 展示多少条数据
* @param module 条件搜索
*/
public Map<String, Object> findAllByEquipmentModule(Map<String, Object> result, int pageNo, int pageSize, String module) {
return dao.findModuleBySearcher(result, pageNo, pageSize, module);
}
其中的dao的声明如下:
@Resource(name = "moduleRepository")
private ModuleRepository dao;
上述代码:实现了,如果在前台查询所有的时候,若添加了搜索条件,那么就只查询moduleRepository表的所有数据中name字段like前台传来的字符串值。
即同一般数据库的对某个字段的like搜索。
当然,上面只是我简单的例子,一般Java里面还是有很多的用法,具体参考下面这个链接:
java 中 mongodb的各种操作 模糊查询 精确查询 等等