關(guān)于JPA中動(dòng)態(tài)查詢的做法

原文出處:

【一目了然】Spring Data JPA使用Specification動(dòng)態(tài)構(gòu)建多表查詢、復(fù)雜查詢及排序示例


最近的一個(gè)需求是帶條件查詢,可是有的條件不是必填的選項(xiàng),所以后端接收的時(shí)候有的參數(shù)可能為null,該怎么解決呢,網(wǎng)上查詢了相關(guān)做法,我是這么做的:

實(shí)體類(lèi)就用Student為例子,大家可以自行替換成自己的

  • 首先給出實(shí)體類(lèi)Student的定義

@Entity
@Table(name = "tblStudent")
@Data
public class TblStudent {


    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "name")
    private String name;

    @Column(name = "age")
    private Integer age;

    @Column(name = "sex")
    private String  sex;

    
}

  • 這里是后端Controller接口定義
@RestController
@Slf4j
@RequestMapping(value = "/student")
public class StudentController {
@GetMapping("/list")
public JsonResult<List<Student>> getStudentList(@RequestParam() Integer _page,
                                                    @RequestParam() Integer _limit,
                                                    @RequestParam(required = false) String name,
                                                    @RequestParam(required = false) Integer age,
                                                    @RequestParam(required = false) String sex){
}
}

因?yàn)槭菞l件查詢,他們可能會(huì)從name/age/sex里面選擇一兩個(gè)或者全部查詢所以 我用上了@RequestParam(required=false)
代表該參數(shù)(字段?)不是必須的,如果前臺(tái)提交的請(qǐng)求沒(méi)有這個(gè)參數(shù),默認(rèn)是null.

  • 在注入需要的service后就是調(diào)用對(duì)應(yīng)的Service里面的方法
@RestController
@Slf4j
@RequestMapping(value = "/student")
public class StudentController {
    
    @Autowired
    private StudentService studentService;

    @GetMapping("/list")
    public JsonResult<List<Student>> getLogList(@RequestParam() Integer _page,
                                                @RequestParam() Integer _limit,
                                                @RequestParam(required = false) String name,
                                                @RequestParam(required = false) Integer age,
                                                @RequestParam(required = false) String sex){


    //這里因?yàn)橐獙?xiě)分頁(yè),通過(guò)前臺(tái)傳來(lái)參數(shù)進(jìn)行操作,如果不用分頁(yè)可以不寫(xiě)
     if (0 == _page.intValue() || 1 == _page.intValue()) {
            _page = 0;
     } else {
            _page = page - 1;
     }

    //這里pageable因?yàn)槲曳猪?yè)用到了,當(dāng)然你們不用的話可以不要
     Pageable pageable = PageRequest.of(_page, _limit);
     Page<TblStudent> page = studentService.getStudentService(name,age,sex,pageable);
                  

            //這樣你就取到了你需要的數(shù)據(jù)了,后面需要做些什么操作就看具體業(yè)務(wù)需要了

}
}



  • 下面是StudentService的內(nèi)容

@Service
@Slf4j
public class StudentService {

    @Autowired
    private StudentRepository studentRepository;//注入StudentRepository

    public Page<TblStudent> getStudentList(String name, Integer  age, String sex,Pageable pageable) {
            Specification<TblStudent> specification = (Specification<TblStudent>) (root, criteriaQuery, cb) -> {
            //存放查詢條件
            List<Predicate> predicatesList = new ArrayList<>();
            //like模糊查詢
            if (!StringUtils.isEmpty(name)) {
                Predicate namePredicate = cb.like(root.get("name"), '%' + name + '%');
                predicatesList.add(namePredicate);
            }
            //equals精確查詢 Integer類(lèi)型
            if (!StringUtils.isEmpty(age)) {
                Predicate moduleNmPredicate = cb.gt(root.get("age"), age);
                predicatesList.add(agePredicate);
            }
            //精確查詢String類(lèi)型
            if (!StringUtils.isEmpty(sex)) {
                Predicate sexPredicate = cb.equal(root.get("sex"), sex);
                predicatesList.add(sexPredicate);
            }
            //between相當(dāng)于SQL的between  ... and ...這里是where age between 10 and 20
            if (age != null) {
                Predicate crtTimePredicate = cb.between(root.get("age"), 10, 20);
                predicatesList.add(crtTimePredicate);
            }
            //排序
            criteriaQuery.orderBy(cb.asc(root.get("age")));
            //最終將查詢條件拼好然后return
            Predicate[] predicates = new Predicate[predicatesList.size()];
            return cb.and(predicatesList.toArray(predicates));

        }
        Page<TblStudent> page = studentRepository.findAll(specification, pageable);
            return page;
        }


}



  • 最后在DAO層的Repository中繼承JpaSpecificationExecutor和JpaRepository
public interface StudentRepository extends JpaRepository<TblStudent, Integer>, JpaSpecificationExecutor<TblStudent> {}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末纳像,一起剝皮案震驚了整個(gè)濱河市窖张,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豹障,老刑警劉巖冯事,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異血公,居然都是意外死亡昵仅,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)累魔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)摔笤,“玉大人,你說(shuō)我怎么就攤上這事垦写÷朗溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵梯投,是天一觀的道長(zhǎng)命辖。 經(jīng)常有香客問(wèn)我,道長(zhǎng)分蓖,這世上最難降的妖魔是什么尔艇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮么鹤,結(jié)果婚禮上终娃,老公的妹妹穿的比我還像新娘。我一直安慰自己蒸甜,他們只是感情好尝抖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布毡们。 她就那樣靜靜地躺著,像睡著了一般昧辽。 火紅的嫁衣襯著肌膚如雪衙熔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天搅荞,我揣著相機(jī)與錄音红氯,去河邊找鬼。 笑死咕痛,一個(gè)胖子當(dāng)著我的面吹牛痢甘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茉贡,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼塞栅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了腔丧?” 一聲冷哼從身側(cè)響起放椰,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愉粤,沒(méi)想到半個(gè)月后砾医,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衣厘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年如蚜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片影暴。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡错邦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出型宙,到底是詐尸還是另有隱情兴猩,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布早歇,位于F島的核電站,受9級(jí)特大地震影響讨勤,放射性物質(zhì)發(fā)生泄漏箭跳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一潭千、第九天 我趴在偏房一處隱蔽的房頂上張望谱姓。 院中可真熱鬧,春花似錦刨晴、人聲如沸屉来。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)茄靠。三九已至茂契,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慨绳,已是汗流浹背掉冶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脐雪,地道東北人厌小。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像战秋,于是被迫代替她去往敵國(guó)和親璧亚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355