問題一:單條件查詢?nèi)绾尾椋?/h3>
問題二:非IBaseMongoRepository接口原生的方法愕掏,采用自定義倉庫?
問題三:如何結(jié)合jpa和mogodb語句從mogodb數(shù)據(jù)庫查詢出數(shù)據(jù)孩革?
解決問題一:
單條件查詢mogodb數(shù)據(jù)说莫,直接定義接口倉庫類:
public interface xxx extends IBaseMongoRepository<實體類, Serializable> {
}
原因:IBaseMongoRepository實現(xiàn)了在mogodb原生的sql增刪改查功能,即存在:
xxx .save();
xxx .findAll();
xxx .findOne();
xxx .delete();
等等操作mogodb數(shù)據(jù)的方法赢赊。
解決問題二:
非IBaseMongoRepository接口原生的方法乙漓,自定義接口倉庫類:
public interface xxx extends IBaseMongoRepository<實體類, Serializable> {
接收數(shù)據(jù)的類型 自定義名(參數(shù));
}
解決問題三:
結(jié)合jpa和mogodb語句從mogodb數(shù)據(jù)庫查詢出數(shù)據(jù):
舉例多條件查詢數(shù)據(jù):
{
條件:設備號释移,序號叭披,時間戳
規(guī)則1、當條件全部為空時玩讳,查詢所有數(shù)據(jù)涩蜘。
規(guī)則2、當其中某一個或者多個條件沒有時熏纯,模糊匹配所有該字段下的所有數(shù)據(jù)同诫。
規(guī)則3、當時間戳一頭沒有數(shù)據(jù)傳入時樟澜,可以查詢出另一頭時間到上限或者下限日期误窖。
}
控制層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();
}
}
我在定義前端傳參數(shù)的時候叮盘,不是沒有想過將多個參數(shù)封裝成一個req的請求對象類霹俺,也就是讓前端直接將所有參數(shù)傳到一個對象中柔吼,然后在業(yè)務層面直接取或者在sql層面直接取出動態(tài)判斷丙唧。但是,在執(zhí)行過程中艇棕,發(fā)現(xiàn)mogodb對sql的操作無法做到像操作mysql數(shù)據(jù)庫一樣動態(tài)實現(xiàn)sql語句的判斷蝌戒。鄙人才疏學淺,如有大佬知道沼琉,希望多多指教。
接口層AalService:
public interface AalService {
Object selectByCondition(String imsi, String serialNumber, String buildTimeAfter, String buildTimeBefore);
}
在定義接口層面友鼻,未防止數(shù)據(jù)類型接收不對,我將類型統(tǒng)一成Object類型闺骚。
接口層實現(xiàn)類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<BiolandData> biolandDataList = biolandRepository.findPressureByISD(imsi, serialNumber, buildDateBefore, buildDateAfter);
return biolandDataList;
}
}
我利用postman模擬前端請求彩扔,發(fā)現(xiàn)傳入日期格式為String類型,但數(shù)據(jù)表日期類型為Date類型僻爽,所以在日期數(shù)據(jù)上進行了轉(zhuǎn)換,但在轉(zhuǎn)換中可能出現(xiàn)異常敦捧,原本打算新建一個異常的類碰镜,用來接catch拋出來的異常并丟出信息給前端。
接口倉庫類BiolandRepository绪颖,直接操作sql數(shù)據(jù):
public interface BiolandRepository extends IBaseMongoRepository<BiolandData, Serializable> {
@Query(value = "{" +
" imsiCode:{$regex:?0},\n" +
" serialNumber:{$regex:?1},\n" +
" buildTime:{$gte:?2,$lte:?3}\n" +
"}")
List<BiolandData> findPressureByISD(String imsi, String serialNumber, Date buildTimeBefore, Date buildTimeAfter);
}
這里利用了mogodb+jpa集成的一個類似于mybatis+mysql語句的格式。原因在于柠横,如果以代碼層次將數(shù)據(jù)經(jīng)行增刪改查,無疑在代碼量上經(jīng)行了猛烈抨擊雁乡,多且復雜糜俗。這不符合我們常說的敏捷開發(fā)曲饱。@Query注解是基于(Spring Data JPA)的珠月,其value值可以存入操作mogodb數(shù)據(jù)的語句扩淀。在mogodb里面啤挎,數(shù)據(jù)的查詢語句以:
db.getCollection('biolandData').find({})
開始,在find({})的大括號里可以經(jīng)行查詢等操作胜臊。
舉例解釋:
imsiCode:{$regex:?0},\n
imsiCode為數(shù)據(jù)庫字段伙判;
\n .........換行符;
?0 .........對應 List<BiolandData> findPressureByISD(String imsi, String serialNumber, Date buildTimeBefore, Date buildTimeAfter)中下標為0的參數(shù)宴抚,即String imsi勒魔,也就是前端傳入的imsi值菇曲;
$regex: .........為匹配符,當判斷字符串是否為空時弟胀,可利用這個匹配符喊式,可以看成mysql數(shù)據(jù)操作符like。也就是當你這個字段為空時垃帅,查詢操作時剪勿,會將該字段下的所有數(shù)據(jù)查詢出來。
由于
buildTime:{$gte:?2,$lte:?3}\n
這個字段中酱固,是時間戳的形式。mogodb不會像mysql動態(tài)那樣运悲,判斷某個時間節(jié)點沒有傳入?yún)?shù)也能查詢出另一個時間條件下的所有記錄项钮。所以我在業(yè)務邏輯層定義了:
if (buildTimeAfter == null || "".equals(buildTimeAfter)) {
buildTimeAfter = "2555-12-12";
}
if (buildTimeBefore == null || "".equals(buildTimeBefore)) {
buildTimeBefore = "2000-01-01";
}
即判斷傳入的時間戳的值是否為空希停,若為空給定它一個范圍較大的值署隘,就解決了這個sql語句在一端為空時,另一端存在卻無效的情況违崇。這是個笨方法诊霹,如果有大佬有更好的方法,希望多多指教脾还。