当前使用版本(必填,否则不予处理)
3.0.7.1
该问题是如何引起的?(确定最新版也有问题再提!!!)
条件构造器中 apply(boolean condition, String applySql, Object... params) 中的 condition 没有生效
重现步骤(如果有就写完整)
这种写法不行
@Override
public PageUtils selectByPaymentDateAndFactoryCode(Map<String, Object> params) {
// 获取缴费日期
Date paymentDate = Convert.toDate(params.get("paymentDate"));
// 获取厂区代码
String factoryCode = Convert.toStr(params.get("factoryCode"));
QueryWrapper<SalaryWaterStatisticsEntity> queryWrapper = new QueryWrapper<SalaryWaterStatisticsEntity>()
.apply(ObjectUtil.isNotNull(paymentDate), "year(payment_date) = {0} and month(payment_date) = {1}", DateUtil.year(paymentDate), DateUtil.month(paymentDate) + 1)
.eq(ObjectUtil.isNotNull(factoryCode), "factory_code", factoryCode)
// 根据缴费日期降序
.orderByDesc("payment_date");
// 根据缴费日期和厂区代码进行查询(可单查,可双查)
IPage<SalaryWaterStatisticsEntity> page = this.page(
new Query<SalaryWaterStatisticsEntity>().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
这种写法可以
@Override
public PageUtils selectByPaymentDateAndFactoryCode(Map<String, Object> params) {
// 获取缴费日期
Date paymentDate = Convert.toDate(params.get("paymentDate"));
// 获取厂区代码
String factoryCode = Convert.toStr(params.get("factoryCode"));
QueryWrapper<SalaryWaterStatisticsEntity> queryWrapper = new QueryWrapper<SalaryWaterStatisticsEntity>()
.eq(ObjectUtil.isNotNull(factoryCode), "factory_code", factoryCode)
// 根据缴费日期降序
.orderByDesc("payment_date");
if (ObjectUtil.isNotNull(paymentDate)) {
queryWrapper.apply("year(payment_date) = {0} and month(payment_date) = {1}", DateUtil.year(paymentDate), DateUtil.month(paymentDate) + 1);
}
// 根据缴费日期和厂区代码进行查询(可单查,可双查)
IPage<SalaryWaterStatisticsEntity> page = this.page(
new Query<SalaryWaterStatisticsEntity>().getPage(params),
queryWrapper
);
return new PageUtils(page);
}
报错信息
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: Matthew2Qiao
java基础
condition 条件判断,条件符合执行后面语句,我使用 eq 的 condition 时可以(不写 condition 在外面写 if 也可以),但是 apply 的 condition 就不行,只有在外面使用不加 condition 的 if 才可以
wrapper.eq(ObjectUtil.isNotNull(factoryCode), "factory_code", factoryCode)
// 上面和下面写法都可以使用,上下两种写法都为factory为空则语句不执行
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);
}