当前使用版本(必填,否则不予处理)

3.0.7.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

condition 条件判断,条件符合执行后面语句,我使用 eqcondition 时是正常的(不写 condition 在外面写 if 也可以),但是 applycondition 就不行,只有在外面使用不加 conditionif 才是正常的

重现步骤(如果有就写完整)

wrapper.eq(ObjectUtil.isNotNull(factoryCode), "factory_code", factoryCode)
// 上面和下面写法都可以使用,上下两种写法都为factoryCode为空则语句不执行(两种写法测试正常)
if (ObjectUtil.isNotNull(factoryCode)) {
    wrapper.eq("factory_code", factoryCode)
}
wrapper.apply(ObjectUtil.isNotNull(paymentDate), "year(payment_date) = {0} and month(payment_date) = {1}", DateUtil.year(paymentDate), DateUtil.month(paymentDate) + 1)
// 上面如果paymentDate为空会报null的错误,而不是不执行后面的语句(测试不正常),下面写法paymentDate为空则语句不执行(测试正常)
if (ObjectUtil.isNotNull(paymentDate)) {
    wrapper.apply("year(payment_date) = {0} and month(payment_date) = {1}", DateUtil.year(paymentDate), DateUtil.month(paymentDate) + 1);
}

报错信息

java.lang.NullPointerException: null
    at cn.hutool.core.date.DateTime.<init>(DateTime.java:103)
    at cn.hutool.core.date.DateTime.of(DateTime.java:44)
    at cn.hutool.core.date.DateUtil.year(DateUtil.java:179)
        // 第 271 行就是 `apply(ObjectUtil.isNotNull(paymentDate), "year(payment_date) = {0} and month(payment_date) = {1}", DateUtil.year(paymentDate), DateUtil.month(paymentDate) + 1)` 这一句报错
    at com.greatoo.modules.app.service.impl.SalaryWaterStatisticsServiceImpl.selectByPaymentDateAndFactoryCode(SalaryWaterStatisticsServiceImpl.java:271)
    at com.greatoo.modules.app.service.impl.SalaryWaterStatisticsServiceImpl$$FastClassBySpringCGLIB$$31538.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:684)
    at com.greatoo.modules.app.service.impl.SalaryWaterStatisticsServiceImpl$$EnhancerBySpringCGLIB$$e2ba0d89.selectByPaymentDateAndFactoryCode(<generated>)
    at com.greatoo.modules.salary.controller.SalaryWaterStatisticsController.selectByPaymentDateAndFactoryCode(SalaryWaterStatisticsController.java:82)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:800)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1038)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:112)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at com.greatoo.common.xss.XssFilter.doFilter(XssFilter.java:25)

Comment From: miemieYaho

java基础懂不懂!函数执行入参就得安排明白

Comment From: helloshisheng

java基础懂不懂!函数执行入参就得安排明白

我之前没看懂以为老哥很暴躁。后来才发现我java基础确实不好

Comment From: helloshisheng

补充一下

 LambdaQueryChainWrapper<>(demoMapper)
                .eq(demoBO!= null, DemoDO::getEnabled, demoBO.getEnabled())

我想的是当demoBO!=null的时候后面都不会执行。但是这不是代码执行的逻辑,它首先要入参,入参又不会判断demoBO是不是为null

Comment From: Matthew2Qiao

.eq(StrUtil.isNotBlank(hrPayGradeEntity.getPayType()), "pay_type", hrPayGradeEntity.getPayType()).like(StrUtil.isNotBlank(hrPayGradeEntity.getPayDutiesName()), "pay_duties_name", hrPayGradeEntity.getPayDutiesName()).in(employeeState != null && employeeState == 0, "employee_state", 1, 2).between(hireDateBegin != null && hireDateEnd != null, "hire_date", hireDateBegin, hireDateEnd) 项目中都是这样写的,也有效果,刚好看到官方文档更新的时候,apply(boolean condition, String applySql, Object... params)多了个condition,可以简化代码,习惯性就使用上面那种写法,就没去想入参的问题