问题一:单条件查询如何查?

问题二:非IBaseMongoRepository接口原生的方法,采用自定义仓库?

问题三:如何结合jpa和mogodb语句从mogodb数据库查询出数据?

解决问题一:

单条件查询mogodb数据,直接定义接口仓库类:

public interface xxx extends IBaseMongoRepository {

原因:IBaseMongoRepository实现了在mogodb原生的sql增删改查功能,即存在:

xxx .save();

xxx .findAll();

xxx .findOne();

xxx .delete();

等等操作mogodb数据的方法。

解决问题二:

非IBaseMongoRepository接口原生的方法,自定义接口仓库类:

public interface xxx extends IBaseMongoRepository {

接收数据的类型 自定义名(参数);

解决问题三:

结合jpa和mogodb语句从mogodb数据库查询出数据:

举例多条件查询数据:

条件:设备号,序号,时间戳

规则1、当条件全部为空时,查询所有数据。

规则2、当其中某一个或者多个条件没有时,模糊匹配所有该字段下的所有数据。

规则3、当时间戳一头没有数据传入时,可以查询出另一头时间到上限或者下限日期。

控制层DeviceController:

public class DeviceController {

@GetMapping("/aal/v1/selectByCondition")

public Result selectByCondition(String imsi, String serialNumber, String buildTimeAfter, String buildTimeBefore) {

aalService.selectByCondition(imsi, serialNumber, buildTimeAfter, buildTimeBefore);

return Result.success();

}

我在定义前端传参数的时候,不是没有想过将多个参数封装成一个req的请求对象类,也就是让前端直接将所有参数传到一个对象中,然后在业务层面直接取或者在sql层面直接取出动态判断。但是,在执行过程中,发现mogodb对sql的操作无法做到像操作mysql数据库一样动态实现sql语句的判断。鄙人才疏学浅,如有大佬知道,希望多多指教。

接口层AalService:

public interface AalService {

Object selectByCondition(String imsi, String serialNumber, String buildTimeAfter, String buildTimeBefore);

在定义接口层面,未防止数据类型接收不对,我将类型统一成Object类型。

接口层实现类AalServiceImpl:

public class AalServiceImpl implements AalService {

@Override

public Object selectByCondition(String imsi, String serialNumber, String buildTimeAfter, String buildTimeBefore) {

if (buildTimeAfter == null || "".equals(buildTimeAfter)) {

buildTimeAfter = "2555-12-12";

}

if (buildTimeBefore == null || "".equals(buildTimeBefore)) {

buildTimeBefore = "2000-01-01";

}

Date buildDateBefore = null;

Date buildDateAfter = null;

try {

buildDateBefore = new SimpleDateFormat("yyyy-MM-dd").parse(buildTimeBefore);

} catch (ParseException e) {

e.printStackTrace();

}

try {

buildDateAfter = new SimpleDateFormat("yyyy-MM-dd").parse(buildTimeAfter);

} catch (ParseException e) {

e.printStackTrace();

}

List biolandDataList = biolandRepository.findPressureByISD(imsi, serialNumber, buildDateBefore, buildDateAfter);

return biolandDataList;

}

我利用postman模拟前端请求,发现传入日期格式为String类型,但数据表日期类型为Date类型,所以在日期数据上进行了转换,但在转换中可能出现异常,原本打算新建一个异常的类,用来接catch抛出来的异常并丢出信息给前端。

接口仓库类BiolandRepository,直接操作sql数据:

public interface BiolandRepository extends IBaseMongoRepository {

@Query(value = "{" +

" imsiCode:{$regex:?0},\n" +

" serialNumber:{$regex:?1},\n" +

" buildTime:{$gte:?2,$lte:?3}\n" +

"}")

List findPressureByISD(String imsi, String serialNumber, Date buildTimeBefore, Date buildTimeAfter);

这里利用了mogodb+jpa集成的一个类似于mybatis+mysql语句的格式。原因在于,如果以代码层次将数据经行增删改查,无疑在代码量上经行了猛烈抨击,多且复杂。这不符合我们常说的敏捷开发。@Query注解是基于(Spring Data JPA)的,其value值可以存入操作mogodb数据的语句。在mogodb里面,数据的查询语句以:

db.getCollection('biolandData').find({})

开始,在find({})的大括号里可以经行查询等操作。

举例解释:

imsiCode:{$regex:?0},\n

imsiCode为数据库字段;

\n .........换行符;

?0 .........对应 List findPressureByISD(String imsi, String serialNumber, Date buildTimeBefore, Date buildTimeAfter)中下标为0的参数,即String imsi,也就是前端传入的imsi值;

$regex: .........为匹配符,当判断字符串是否为空时,可利用这个匹配符,可以看成mysql数据操作符like。也就是当你这个字段为空时,查询操作时,会将该字段下的所有数据查询出来。

由于

buildTime:{$gte:?2,$lte:?3}\n

这个字段中,是时间戳的形式。mogodb不会像mysql动态那样,判断某个时间节点没有传入参数也能查询出另一个时间条件下的所有记录。所以我在业务逻辑层定义了:

if (buildTimeAfter == null || "".equals(buildTimeAfter)) {

buildTimeAfter = "2555-12-12";

}

if (buildTimeBefore == null || "".equals(buildTimeBefore)) {

buildTimeBefore = "2000-01-01";

}

即判断传入的时间戳的值是否为空,若为空给定它一个范围较大的值,就解决了这个sql语句在一端为空时,另一端存在却无效的情况。这是个笨方法,如果有大佬有更好的方法,希望多多指教。

mongorepository查询条件_springboot jpa + mongodb实现多条件查询数据相关推荐

  1. vue+node多条件查询 分页_SpringBoot+JPA框架分页、带条件查询等操作

    前言 最近研究JPA框架,初学SpringBoot时也简单学过,但是不是很深入,所以这次主要是说一些进阶且常用.实用的操作! 前置准备 创建两张表或者让JPA自动建表,任意选择!学生表 package ...

  2. java jpa 模糊查询_Sring Data JPA使用Predicate进行模糊查询、按时间段查询

    2021-02-02 21:26:32 回复TA It is with sad regret to inform you StarDataGroup.com is shutting down. Fir ...

  3. mongorepository查询条件_Java操作MongoDB采用MongoRepository仓库进行条件查询 | 学步园...

    1.实体类: publicclassPersonimplementsSerializable{ /** * */ private static final long serialVersionUID  ...

  4. JPA以外键为条件查询出的List(外键过滤并存入JSONObject)

    JPA以外键为条件查询出的List(外键过滤并存入JSONObject) 一.Service层 1.service接口 package com.lz_nms.service;​import net.s ...

  5. java mongodb 多表关联查询,多条件查询,分页,排序

    前言: 由于最近项目赶,版本迭代快,不知道大BOSS从哪里听别人说MongoDB用来做关系型数据库好,而且速度快,性能高:听到这话的我,立马就反驳了回去:"MongoDB不支持事物" ...

  6. jpa多表联查动态_Spring Data JPA 连表动态条件查询

    多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现(使用较为复杂,查询不够灵活),第二种是使用原生sql查询. JPA原生SQL连表查询 @Rep ...

  7. mongodb cond 模糊查询_为了实现在线库的复杂查询,你还在双写吗?

    一.在线库不支持在线复杂查询 做在线业务的开发者经常会碰到这样的难题:在线数据库上面运行稍微复杂点的查询,在线业务就挂了!不管是单机数据库如MySQL.PG,还是分布式数据库,HBase.MongoD ...

  8. python数据库模糊查询_Python操作mongodb数据库进行模糊查询操作示例

    本文实例讲述了Python操作mongodb数据库进行模糊查询操作.分享给大家供大家参考,具体如下: # -*- coding: utf-8 -*- import pymongo import re ...

  9. MongoDB 教程三: 高级查询 (SQL到MongoDB映射表)

    查询接口 对于查询操作,MongoDB 提供了 db.collection.find() 方法.这个方法接收查询条件和映射两个条件并且返回一个指向匹配文档的 游标 .你可以使用 limits, ski ...

最新文章

  1. 【面试 多线程】【第九篇】多线程的问题
  2. 如何采集Nginx的日志?
  3. plsql连接oracle报错12514,plsql 登录 oracle11 12514 错误的处理方法
  4. Matlab中typecast函数由int8转换为int32
  5. 拿了 30K 的 offer!
  6. java的多态性学习代码
  7. vs2005's addin folder
  8. 730阵列卡支持多大硬盘_凯捷月销破2万,配6座头等舱空间,到底有多舒服?试驾了才知道...
  9. 论文浅尝 | 主题驱动的分子图表示对比学习
  10. 安卓 linux 街机 dc,DC最强的街机模拟器
  11. 房地产建筑行业HTML5模板
  12. Linux mv命令:移动文件或改名
  13. Vue项目中的文件/文件夹命名规范
  14. python语法学习第六天--集合
  15. 基于Hadoop生态系统的一种高性能数据存储格式CarbonData(基础篇)
  16. 用termux打开python文件,安卓手机运行python程序的软件:Termux、Pydroid3
  17. LimeSDR官方系列教程(五):SDR的软件
  18. 算术右移与逻辑右移的转换
  19. Web前端开发三剑客是做什么的?
  20. 目标跟踪系列三:ECO: Efficient Convolution Operators for Tracking(2016年11月)

热门文章

  1. 苹果发布会总结:全新 iMac、iPad Pro、 紫色 iPhone 12 和 AirTag 登场
  2. linkerd服务网格调研笔记
  3. 中止执行后超过2年_失信被执行人怎么撤销 超过两年会撤销吗
  4. bzoj1645 / P2061 [USACO07OPEN]城市的地平线City Horizon(扫描线)
  5. 传输层 - TCP / UDP 协议详解
  6. 搜索网页显示找不到服务器,显示:DNS 查找失败,因此找不到 x 的服务器。DNS 是将网站名称解析为互联网地址的网络服务...
  7. 读书笔记:《枪炮、病菌与钢铁》与《1984》
  8. 《清单革命》对程序开发的一些启示
  9. iPhone怎么设置代理ip
  10. 时间子系统10_hpet时钟初始化