miemie преди 6 години
родител
ревизия
d82d9cfa74
променени са 1 файла, в които са добавени 25 реда и са изтрити 1 реда
  1. 25 1
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/OptimisticLockerInterceptor.java

+ 25 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/OptimisticLockerInterceptor.java

@@ -2,7 +2,9 @@ package com.baomidou.mybatisplus.extension.plugins;
 
 import java.lang.reflect.Field;
 import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -22,6 +24,7 @@ import org.apache.ibatis.plugin.Signature;
 
 import com.baomidou.mybatisplus.annotation.Version;
 import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
+import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.enums.SqlKeyword;
 import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
@@ -65,6 +68,7 @@ public class OptimisticLockerInterceptor implements Interceptor {
     private static final String NAME_ENTITY = Constants.ENTITY;
     private static final String NAME_ENTITY_WRAPPER = Constants.WRAPPER;
     private static final String PARAM_UPDATE_METHOD_NAME = "update";
+    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private final Map<Class<?>, EntityField> versionFieldCache = new ConcurrentHashMap<>();
     private final Map<Class<?>, List<EntityField>> entityFieldsCache = new ConcurrentHashMap<>();
 
@@ -119,7 +123,7 @@ public class OptimisticLockerInterceptor implements Interceptor {
                             map.put(NAME_ENTITY_WRAPPER, uw);
                             field.set(et, updatedVersionVal);
                         } else {
-                            ew.getExpression().add(versionField::getColumnName, SqlKeyword.EQ, () -> "'" + originalVersionVal + "'");
+                            ew.getExpression().add(versionField::getColumnName, SqlKeyword.EQ, formatOriginalVal(originalVersionVal));
                             field.set(et, updatedVersionVal);
                             //TODO: should remove version=oldval condition from aw; 0827 by k神
                         }
@@ -175,6 +179,26 @@ public class OptimisticLockerInterceptor implements Interceptor {
         map.put(NAME_ENTITY, entityMap);
     }
 
+    /**
+     * 把旧 version 值进行格式化为 ISqlSegment
+     *
+     * @param originalVersionVal 旧 version 值
+     * @return ISqlSegment
+     */
+    protected ISqlSegment formatOriginalVal(Object originalVersionVal) {
+        String value = originalVersionVal.toString();
+        Class<?> versionValClass = originalVersionVal.getClass();
+        if (Date.class.equals(versionValClass)) {
+            value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Date) originalVersionVal);
+        } else if (Timestamp.class.equals(versionValClass)) {
+            value = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format((Timestamp) originalVersionVal);
+        } else if (LocalDateTime.class.equals(versionValClass)) {
+            value = formatter.format((LocalDateTime) originalVersionVal);
+        }
+        String finalVal = value;
+        return () -> "'" + finalVal + "'";
+    }
+
     /**
      * This method provides the control for version value.<BR>
      * Returned value type must be the same as original one.