Mybatis注解形式tkmapper中Example的復雜查詢


https://github.com/abel533/Mapper

以一個基礎查詢為例子

SELECT * FROM equip_info

 

很多時候會遇到這樣 的情況,例如:

SELECT
    * 
FROM
    rmp_equip_info 
WHERE
    is_active = 'Y' 
    AND
    ( create_by = '560129864519258146' 
    OR arrive_duty IN ( '0900002445' ) )
ORDER BY
    create_date DESC


如果平常的查詢條件,就使用常用的方法就能實現了,參考連接
https://blog.csdn.net/zeal9s/article/details/86659950
如果是復雜一點,需要稍微自定義的查詢呢?Mybatis是使用xml則可以直接套接括號,而example怎樣拼接括號呢?這就很尷尬了

不禁要問不加括號查詢的區別,區別就很大了,括號括起來代表那括號里面的條件已經合並為一個條件了,相當於上面的例子搜索只有兩個條件,如果沒有括號,則是代表查詢條件有三個,數據查詢出來就會不准確,所以Example的括號怎樣加呢?由於它不是直接控制sql的拼寫方式實現的,它是通過方法和對象反射到數據庫的sql的拼寫的,那么它有沒有一種方法可以實現括號的拼接,答案是肯定的。

理解需求:
需求:where查詢,需要支持 a and (b or c and d)or e

也就是b、c、d三個條件是或、且的關系,a與b、c、d條件是且的關系,然后和e是或的關系

方法一:通用example語法

Example e = new Example(User.class);
Example.Criteria criteria = e.createCriteria();
//部門查詢部門
criteria.andEqualTo("departmentId", departmentId);

Example.Criteria c = e.createCriteria();
//關鍵字查詢部分
String keyword = pageReq.getKeyword();
if (StringUtils.isNotEmpty(keyword)) {
   c.orEqualTo("userName", keyword).orEqualTo("policeNo",keyword).orEqualTo("realName",keyword);
}
e.and(c);
PageHelper.startPage(pageReq.getPageIndex(), pageReq.getPageSize());
List<User> users = userMapper.selectByExample(e);


多層條件結合查詢,各自創建自己的cirteria,再用and或者or方法去連接,后面的cirteria需要加入Example中去,第一個cirteria不需要加

方法二:Weekend語法(Weekend是高版本的通用mapper版本才有,而且需要java8語法支持,tkmapper需要3.5以上)

//部門查詢部分
Example example = new Example(User.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("departmentId", departmentId);
Weekend<User> weekend = new Weekend<>(User.class);

//關鍵字查詢部分
String keyword = pageReq.getKeyword();
WeekendCriteria<User, Object> keywordCriteria = weekend.weekendCriteria();
if (StringUtils.isNotEmpty(keyword)) {
    keywordCriteria.orLike(User::getUserName, keyword).orLike(User::getPoliceNo, keyword).orLike(User::getRealName, keyword);
}

weekend.and(criteria);

PageHelper.startPage(pageReq.getPageIndex(), pageReq.getPageSize());
List<User> users = userMapper.selectByExample(weekend);

 


方法一和方法二執行的sql語句:

WHERE
department_id = ?
AND
 (user_name = ? 
  OR police_no = ? 
  OR real_name = ?
  )

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM