springboot jpa + mongodb實現(xiàn)多條件查詢數(shù)據(jù)

問題一:單條件查詢?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語句在一端為空時,另一端存在卻無效的情況违崇。這是個笨方法诊霹,如果有大佬有更好的方法,希望多多指教脾还。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赛蔫,隨后出現(xiàn)的幾起案子泥张,更是在濱河造成了極大的恐慌,老刑警劉巖渗钉,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞钙,死亡現(xiàn)場離奇詭異,居然都是意外死亡芒炼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門鲸湃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來子寓,“玉大人,你說我怎么就攤上這事炸裆∠势粒” “怎么了国拇?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵听系,是天一觀的道長。 經(jīng)常有香客問我掉瞳,道長,這世上最難降的妖魔是什么陕习? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任址愿,我火速辦了婚禮,結(jié)果婚禮上损合,老公的妹妹穿的比我還像新娘娘纷。我一直安慰自己,他們只是感情好赖晶,可當我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布遏插。 她就那樣靜靜地躺著,像睡著了一般胳嘲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上了牛,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天白魂,我揣著相機與錄音上岗,去河邊找鬼。 笑死肴掷,一個胖子當著我的面吹牛背传,可吹牛的內(nèi)容都是我干的台夺。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼梳星,長吁一口氣:“原來是場噩夢啊……” “哼滚朵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起辕近,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤移宅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后漏峰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡绢掰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年滴劲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片班挖。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡芯砸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出双揪,到底是詐尸還是另有隱情,我是刑警寧澤渔期,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站拘哨,受9級特大地震影響信峻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜盹舞,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望磷账。 院中可真熱鬧贾虽,春花似錦、人聲如沸蓬豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟆技。三九已至,卻和暖如春质礼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眶蕉。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工造挽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碱璃,地道東北人饭入。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓谐丢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子岳掐,可洞房花燭夜當晚...
    茶點故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容