Browse Source

fix gitee issues/I3UQH5 修复注解@OrderBy,使用limit 异常

hubin 3 years ago
parent
commit
edff5b9de2

+ 1 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/ISqlSegment.java

@@ -31,4 +31,5 @@ public interface ISqlSegment extends Serializable {
      * SQL 片段
      */
     String getSqlSegment();
+
 }

+ 14 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/segments/MergeSegments.java

@@ -15,7 +15,10 @@
  */
 package com.baomidou.mybatisplus.core.conditions.segments;
 
+import com.baomidou.mybatisplus.annotation.OrderBy;
 import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import lombok.AccessLevel;
 import lombok.Getter;
@@ -58,6 +61,17 @@ public class MergeSegments implements ISqlSegment {
         cacheSqlSegment = false;
     }
 
+    /**
+     * 是否使用默认注解 {@link OrderBy} 排序
+     *
+     * @return true 使用 false 不使用
+     */
+    public boolean isUseAnnotationOrderBy() {
+        final String _sqlSegment = this.getSqlSegment();
+        return CollectionUtils.isEmpty(orderBy) && null != _sqlSegment
+            && _sqlSegment.toLowerCase().contains(Constants.LIMIT);
+    }
+
     @Override
     public String getSqlSegment() {
         if (cacheSqlSegment) {

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -254,8 +254,8 @@ public abstract class AbstractMethod implements Constants {
         sql.append(orderByFields.stream().map(tfi -> String.format("%s %s", tfi.getColumn(),
             tfi.getOrderByType())).collect(joining(",")));
         /* 当wrapper中传递了orderBy属性,@orderBy注解失效 */
-        return SqlScriptUtils.convertIf(sql.toString(), String.format("%s == null or %s == null or %s == null or %s.size() == 0",
-            WRAPPER, WRAPPER_EXPRESSION, WRAPPER_EXPRESSION_ORDER, WRAPPER_EXPRESSION_ORDER), true);
+        return SqlScriptUtils.convertIf(sql.toString(), String.format("%s == null or %s == null or %s == null",
+            WRAPPER, WRAPPER_EXPRESSION, WRAPPER_EXPRESSION_ORDER), true);
     }
 
     /**

+ 6 - 7
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -17,11 +17,7 @@ package com.baomidou.mybatisplus.core.metadata;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.core.toolkit.Constants;
-import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.*;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import lombok.AccessLevel;
 import lombok.Data;
@@ -178,7 +174,7 @@ public class TableInfo implements Constants {
      */
     @Getter
     @Setter
-    private List<TableFieldInfo> orderByFields = new LinkedList<>();
+    private List<TableFieldInfo> orderByFields;
 
     /**
      * @since 3.4.4
@@ -426,7 +422,7 @@ public class TableInfo implements Constants {
      * @param isWhere true: logicDeleteValue, false: logicNotDeleteValue
      * @return sql
      */
-    private String formatLogicDeleteSql(boolean isWhere) {
+    protected String formatLogicDeleteSql(boolean isWhere) {
         final String value = isWhere ? logicDeleteFieldInfo.getLogicNotDeleteValue() : logicDeleteFieldInfo.getLogicDeleteValue();
         if (isWhere) {
             if (NULL.equalsIgnoreCase(value)) {
@@ -481,6 +477,9 @@ public class TableInfo implements Constants {
                 this.withUpdateFill = true;
             }
             if (i.isOrderBy()) {
+                if (null == this.orderByFields) {
+                    this.orderByFields = new LinkedList<>();
+                }
                 this.orderByFields.add(i);
             }
             if (i.isVersion()) {

+ 5 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Constants.java

@@ -103,7 +103,7 @@ public interface Constants extends StringPool, Serializable {
     /**
      * wrapper 类的属性 expression 下级属性 order
      */
-    String WRAPPER_EXPRESSION_ORDER = WRAPPER_EXPRESSION + DOT + "orderBy";
+    String WRAPPER_EXPRESSION_ORDER = WRAPPER_EXPRESSION + DOT + "useAnnotationOrderBy";
     /**
      * UpdateWrapper 类的属性 sqlSet
      */
@@ -136,6 +136,10 @@ public interface Constants extends StringPool, Serializable {
      * where
      */
     String WHERE = "WHERE";
+    /**
+     * limit
+     */
+    String LIMIT = "LIMIT";
 
     /**
      * 乐观锁字段

+ 5 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/ExceptionUtils.java

@@ -59,4 +59,9 @@ public final class ExceptionUtils {
         return new MybatisPlusException(t);
     }
 
+    public static void throwMpe(boolean condition, String msg, Object... params) {
+        if (condition) {
+            throw mpe(msg, params);
+        }
+    }
 }

+ 3 - 3
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/toolkit/sql/SqlInjectionUtilsTest.java

@@ -15,10 +15,10 @@ public class SqlInjectionUtilsTest {
     public void sqlTest() {
         assertSql(false, "insert abc");
         assertSql(true, "insert user (id,name) value (1, 'qm')");
-        assertSql(true, "select * from user");
+        assertSql(true, "SELECT * FROM user");
         assertSql(true, "delete from user");
-        assertSql(true, "drop table user");
-        assertSql(true, ";truncate from user");
+        assertSql(true, "drop TABLE user");
+        assertSql(true, ";TRUNCATE from user");
         assertSql(false, "update");
         assertSql(false, "trigger");
         assertSql(true, "and name like '%s123%s'");

+ 3 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/TenantLineInnerInterceptor.java

@@ -138,7 +138,7 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
             // fixed github pull/295
             ItemsList itemsList = insert.getItemsList();
             if (itemsList instanceof MultiExpressionList) {
-                ((MultiExpressionList) itemsList).getExprList().forEach(el -> el.getExpressions().add(tenantLineHandler.getTenantId()));
+                ((MultiExpressionList) itemsList).getExpressionLists().forEach(el -> el.getExpressions().add(tenantLineHandler.getTenantId()));
             } else {
                 ((ExpressionList) itemsList).getExpressions().add(tenantLineHandler.getTenantId());
             }
@@ -423,8 +423,8 @@ public class TenantLineInnerInterceptor extends JsqlParserSupport implements Inn
 
     @Override
     public void setProperties(Properties properties) {
-        PropertyMapper.newInstance(properties)
-                .whenNotBlank("tenantLineHandler", ClassUtils::newInstance, this::setTenantLineHandler);
+        PropertyMapper.newInstance(properties).whenNotBlank("tenantLineHandler",
+            ClassUtils::newInstance, this::setTenantLineHandler);
     }
 }
 

+ 95 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/LastSqlTest.java

@@ -0,0 +1,95 @@
+package com.baomidou.mybatisplus.test.h2;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.test.h2.entity.H2Student;
+import com.baomidou.mybatisplus.test.h2.mapper.H2StudentMapper;
+import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * OrderBy LastSql 混合测试
+ *
+ * @author Dervish
+ */
+@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration(locations = {"classpath:h2/spring-test-h2.xml"})
+public class LastSqlTest {
+
+    @Resource
+    private H2StudentMapper mapper;
+
+    @Test
+    @Order(1)
+    public void delete(){
+        int res = mapper.delete(new LambdaUpdateWrapper<H2Student>().last(" and 1 = 2 ").eq(H2Student::getId, 0));
+        Assertions.assertTrue(res <= 0);
+    }
+
+    @Test
+    @Order(2)
+    public void selectCount(){
+        long result = mapper.selectCount(new LambdaQueryWrapper<H2Student>().last("where 1 =2"));
+        Assertions.assertTrue(result <= 0);
+    }
+
+    @Test
+    @Order(3)
+    public void selectList(){
+        List<H2Student> h2Students = mapper.selectList(new LambdaQueryWrapper<H2Student>().last("limit 1"));
+        Assertions.assertTrue(h2Students.size() == 1);
+    }
+
+    @Test
+    @Order(4)
+    public void selectMaps(){
+        List<Map<String, Object>> maps = mapper.selectMaps(new LambdaQueryWrapper<H2Student>().last("limit 1"));
+        Assertions.assertTrue(maps.size() == 1);
+    }
+
+    @Test
+    @Order(5)
+    public void selectMapsPage(){
+        IPage page = Page.of(0, 10);
+        IPage res = mapper.selectMapsPage(page,new QueryWrapper<H2Student>().last(" /* testSql */ ").comment("test"));
+    }
+
+    @Test
+    @Order(6)
+    public void selectObjs(){
+        List<Object> objects = mapper.selectObjs(new QueryWrapper<H2Student>().last(" limit 1"));
+        Assertions.assertTrue(objects.size() == 1);
+    }
+
+    @Test
+    @Order(7)
+    public void SelectOne(){
+        H2Student h2Student = mapper.selectOne(new QueryWrapper<H2Student>().last(" where 1 = 2"));
+        Assertions.assertTrue(h2Student == null);
+    }
+
+    @Test
+    @Order(8)
+    public void selectPage(){
+        IPage page = Page.of(0, 10);
+        mapper.selectPage(page,new QueryWrapper<H2Student>().last(" /* testSql */ "));
+    }
+
+    @Test
+    @Order(9)
+    public void update(){
+        int res = mapper.update(null, new UpdateWrapper<H2Student>().set("name","dog").last(" where 1 =2 "));
+        Assertions.assertTrue(res <=  0);
+    }
+}

+ 6 - 4
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/entity/H2Student.java

@@ -16,6 +16,7 @@
 package com.baomidou.mybatisplus.test.h2.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.OrderBy;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
@@ -42,11 +43,11 @@ public class H2Student extends Model<H2Student> {
 
 
     /**
-	 * serialVersionUID
-	 */
-	private static final long serialVersionUID = 1290051894415073936L;
+     * serialVersionUID
+     */
+    private static final long serialVersionUID = 1290051894415073936L;
 
-	public H2Student(Long id, String name, Integer age) {
+    public H2Student(Long id, String name, Integer age) {
         this.id = id;
         this.name = name;
         this.age = age;
@@ -57,6 +58,7 @@ public class H2Student extends Model<H2Student> {
 
     private String name;
 
+    @OrderBy
     private GradeEnum grade;
 
     private GenderEnum gender;