瀏覽代碼

优化枚举判断

zhou-hao 7 年之前
父節點
當前提交
0c73d71bd0

+ 13 - 6
hsweb-commons/hsweb-commons-dao/hsweb-commons-dao-mybatis/src/main/java/org/hswebframework/web/dao/mybatis/mapper/EnumDicInTermTypeMapper.java

@@ -40,12 +40,19 @@ public abstract class EnumDicInTermTypeMapper implements TermTypeMapper {
         if (type.isArray()) {
             Class componentType = type.getComponentType();
             if (support(column)) {
-                EnumDict[] newValue = param2list(value)
-                        .stream().map(v -> EnumDict.find(componentType, v).orElse(null))
-                        .filter(Objects::nonNull)
-                        .toArray(EnumDict[]::new);
-                long bit = EnumDict.toBit(newValue);
-                term.setValue(bit);
+                if(componentType.getEnumConstants().length<64){
+                    EnumDict[] newValue = param2list(value)
+                            .stream().map(v -> EnumDict.find(componentType, v).orElse(null))
+                            .filter(Objects::nonNull)
+                            .toArray(EnumDict[]::new);
+                    long bit = EnumDict.toBit(newValue);
+                    term.setValue(bit);
+                }else{
+                    //枚举数量大于等于64,无法使用位运算
+                    // TODO: 2018/4/25 尝试查询字典中间表
+                    buildNotSupport(wherePrefix,term,column,tableAlias);
+                }
+
             } else {
                 return buildNotSupport(wherePrefix, term, column, tableAlias);
             }

+ 1 - 0
hsweb-commons/hsweb-commons-entity/src/main/java/org/hswebframework/web/commons/entity/DataStatusEnum.java

@@ -15,4 +15,5 @@ public enum DataStatusEnum implements EnumDict<Byte> {
     private Byte value;
 
     private String text;
+
 }

+ 6 - 1
hsweb-core/src/main/java/org/hswebframework/web/dict/EnumDict.java

@@ -9,6 +9,7 @@ import java.util.function.Predicate;
  * 枚举字典,使用枚举来实现数据字典,可通过集成此接口来实现一些有趣的功能.
  * ⚠️:如果使用了位运算来判断枚举,枚举数量不要超过64个,且顺序不要随意变动!
  * 如果枚举数量大于64,你应该使用{@link org.hswebframework.web.dict.apply.DictApply}来处理
+ *
  * @author zhouhao
  * @see 3.0
  */
@@ -36,8 +37,12 @@ public interface EnumDict<V> {
      */
     int ordinal();
 
+    default long index() {
+        return ordinal();
+    }
+
     default long getBit() {
-        return 1L << (long) ordinal();
+        return 1L << index();
     }
 
     /**

+ 2 - 0
hsweb-core/src/test/java/org/hswebframework/web/bean/Color.java

@@ -14,4 +14,6 @@ public enum Color implements EnumDict<Integer> {
 
     private String text;
 
+
+
 }