diff --git a/eladmin-common/pom.xml b/eladmin-common/pom.xml
index 2150b4b7..ef1f52a5 100644
--- a/eladmin-common/pom.xml
+++ b/eladmin-common/pom.xml
@@ -8,6 +8,18 @@
2.6
4.0.0
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 11
+ 11
+
+
+
+
5.3.4
diff --git a/eladmin-common/src/main/java/me/zhengjie/converter/EnumSetConverter.java b/eladmin-common/src/main/java/me/zhengjie/converter/EnumSetConverter.java
new file mode 100644
index 00000000..b0d006ca
--- /dev/null
+++ b/eladmin-common/src/main/java/me/zhengjie/converter/EnumSetConverter.java
@@ -0,0 +1,34 @@
+package me.zhengjie.converter;
+
+import javax.persistence.AttributeConverter;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public interface EnumSetConverter> extends AttributeConverter, String> {
+
+ Class enumClass();
+
+ @Override
+ default String convertToDatabaseColumn(final Set attribute) {
+ return attribute == null || attribute.isEmpty() ?
+ null :
+ attribute.stream().map(T::name)
+ .sorted()
+ .collect(Collectors.joining(","));
+ }
+
+ @Override
+ default Set convertToEntityAttribute(final String data) {
+ final var values = Arrays.stream(enumClass().getEnumConstants()).map(T::name).collect(Collectors.toSet());
+ return data == null || data.isBlank() ?
+ null :
+ new LinkedHashSet(Stream.of(data.split(","))
+ .map(String::trim)
+ .filter(values::contains)
+ .map(name -> T.valueOf(enumClass(), name))
+ .collect(Collectors.toList()));
+ }
+}
diff --git a/eladmin-common/src/main/java/me/zhengjie/converter/StringListConverter.java b/eladmin-common/src/main/java/me/zhengjie/converter/StringListConverter.java
new file mode 100644
index 00000000..f62b1c44
--- /dev/null
+++ b/eladmin-common/src/main/java/me/zhengjie/converter/StringListConverter.java
@@ -0,0 +1,23 @@
+package me.zhengjie.converter;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.util.Arrays;
+import java.util.List;
+
+@Converter
+public class StringListConverter implements AttributeConverter, String> {
+
+ @Override
+ public String convertToDatabaseColumn(final List attribute) {
+ return attribute == null || attribute.isEmpty() ? null :
+ String.join("\n", attribute);
+ }
+
+ @Override
+ public List convertToEntityAttribute(final String data) {
+ return data == null || data.isBlank() ?
+ null :
+ Arrays.asList(data.split("\n"));
+ }
+}
diff --git a/eladmin-common/src/main/java/me/zhengjie/converter/StringMapConverter.java b/eladmin-common/src/main/java/me/zhengjie/converter/StringMapConverter.java
new file mode 100644
index 00000000..9ed7f894
--- /dev/null
+++ b/eladmin-common/src/main/java/me/zhengjie/converter/StringMapConverter.java
@@ -0,0 +1,37 @@
+package me.zhengjie.converter;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javax.persistence.AttributeConverter;
+import javax.persistence.Converter;
+import java.io.IOException;
+import java.util.Map;
+
+@Converter
+public class StringMapConverter implements AttributeConverter