springboot專案通常配合mybatisplus來做資料crud,
我們在查詢或更新資料的時候,有時要用到in,比如
SELECT * FROM emax_scbg_order WHERE order_no IN (1305679009380433922,1305405259472830465)
mp中關于in方法的使用,在傳多個欄位值的時候,我們經常搞不清是傳Array呢還是ArrayList呢?
其實,細心的同學,看一下in方法的定義,就明白了,
mp中有4個in方法的多載,
//mybatis-plus-core-3.1.2.jar package com.baomidou.mybatisplus.core.conditions.interfaces; /** * 查詢條件封裝 * * @author hubin miemie HCL * @since 2017-05-26 */ @SuppressWarnings("unchecked") public interface Func<Children, R> extends Serializable { /** * ignore */ default Children in(R column, Collection<?> coll) { return in(true, column, coll); } /** * ignore */ default Children in(R column, Object... values) { return in(true, column, values); } /** * 欄位 IN (v0, v1, ...) * <p>例: in("id", 1, 2, 3, 4, 5)</p> * * <li> 如果動態陣列為 empty 則不會進行 sql 拼接 </li> * * @param condition 執行條件 * @param column 欄位 * @param values 資料陣列 * @return children */ default Children in(boolean condition, R column, Object... values) { return in(condition, column, Arrays.stream(Optional.ofNullable(values).orElseGet(() -> new Object[]{})) .collect(toList())); } /** * 欄位 IN (value.get(0), value.get(1), ...) * <p>例: in("id", Arrays.asList(1, 2, 3, 4, 5))</p> * * <li> 如果集合為 empty 則不會進行 sql 拼接 </li> * * @param condition 執行條件 * @param column 欄位 * @param coll 資料集合 * @return children */ Children in(boolean condition, R column, Collection<?> coll); }
我們可以看到,in方法接收欄位值的方式,一種是Object...,一種是Collection<?>,
Collection<?>不用說了,是集合,比如Listt<E>、Sett<E>、Queuet<E>等,
Object...是可變長引數,可變長引數是個陣列,可以接收一個引數或多個引數,或者是陣列,
也就是說,in方法同時支持傳入陣列和集合,取決于你呼叫哪個多載方法,
正確姿勢一:
List<Long> ids = Arrays.asList(122L,23L);; new QueryWrapper<Driver>().lambda().in(Driver::getServiceId,ids);
正確姿勢二:
Long[] ids={1305679009380433922,1305679009380433922};
LambdaQueryWrapper<Driver> queryWrapper = new QueryWrapper<Driver>().lambda().in(Driver::getServiceId,ids);
正確姿勢三:
new QueryWrapper<Driver>().lambda() .in(Driver::getServiceId,1305679009380433922,1305679009380433922);
正確結果:
==> Preparing: SELECT * FROM emax_scbg_order WHERE order_no IN (?,?) ==> Parameters: 1305679009380433922(String), 1305405259472830465(String) <== Total: 2
千萬別傳模棱兩可的引數,這樣jvm會給你意想不到的結果,
錯誤姿勢一:
.in(StringUtils.isNotBlank(vo.getOrderNumList()),ScbgOrder::getOrderNo,
StringUtils.isNotBlank(vo.getOrderNumList()) ? vo.getOrderNumList().split(",") : "")
錯誤結果一:
==> Preparing: SELECT * FROM emax_scbg_order WHERE order_no IN (?)
==> Parameters: [Ljava.lang.String;@3eb6d7a9(String[])
<== Total: 0
除錯程式可以看到values里的引數值:
錯誤姿勢二:
.in(StringUtils.isNotBlank(vo.getOrderNumList()),ScbgOrder::getOrderNo,"123,4566");
錯誤結果二:
==> Preparing: SELECT * FROM emax_scbg_order WHERE order_no IN (?)
==> Parameters: 1,3(String)
<== Total: 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56138.html
標籤:Java
