在使用@Query()的时候,只能一次写一些简单的查询语句,对于一些复杂的查询语句,一个简单的@Query()是满足不了需求的。
比如:有时候有个字段是有值的,有时候又是没值的。究竟怎么查询!!!

@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的各种操作 模糊查询 精确查询 等等





发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

@DBRef---------------springMVC知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。