Java 如何使用Mybatis和PostgreSQL创建空数组?

Java 如何使用Mybatis和PostgreSQL创建空数组?,java,arrays,postgresql,jdbc,mybatis,Java,Arrays,Postgresql,Jdbc,Mybatis,当我用Mybatis和Postgres写我的项目时,发生了一些令人恶心的事情 您知道Postgres有一个很棒的类型数组,但是创建java.sql.ARRAY的唯一方法是java.sql.Connection:createOftypeName,arrayContent,以下是背景 为了在列表和数组之间建立关系,我编写了以下TypeHandler: @MappedTypes(List.class) @MappedJdbcTypes({JdbcType.ARRAY}) public class Li

当我用Mybatis和Postgres写我的项目时,发生了一些令人恶心的事情

您知道Postgres有一个很棒的类型数组,但是创建java.sql.ARRAY的唯一方法是java.sql.Connection:createOftypeName,arrayContent,以下是背景

为了在列表和数组之间建立关系,我编写了以下TypeHandler:

@MappedTypes(List.class)
@MappedJdbcTypes({JdbcType.ARRAY})
public class ListTypeHandler extends BaseTypeHandler<List> {
 private static final String TYPE_NAME_UUID = "uuid";

 @Override
 public void setNonNullParameter(PreparedStatement ps, int i, List list, JdbcType jdbcType) throws SQLException {
   Connection conn = ps.getConnection();

   if(list.size() != 0) {
     Object[] parameter = list.toArray(new Object[0]);
     String typeName = null;
     // using a switch to determine how to map the Java type to the sql type
     if (list.get(0) instanceof UUID) {
       typeName = TYPE_NAME_UUID;
     }

     if (typeName == null) {
       throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
     }
     Array array = conn.createArrayOf(typeName, parameter);
     ps.setArray(i, array);
   } else {
     // here is the hard point
     ps.setArray(i, conn.createArrayOf("uuid", new Object[0]));
   }
 }

 private List getArray(Array array) {
   try {
     return Arrays.asList((Object[])array.getArray());
   } catch (Exception e) {
     return null;
   }

 }
}
if (list.isEmpty()) {
   ps.setObject(i, Collections.<Object>emptySet());
} else {
   //process non-empty list
}
由于FXCKK擦除,java.sql.Array中没有类型,列表中也没有,而且我的数据库中有很多不同类型的数组,所以我必须制作一个统一的TypeHandler来处理数组和列表的关系

我的解决方案是获取列表中的第一个对象并查看其类型,然后将其映射到数据库中的首选类型。一切似乎都很好

但是当一张空的清单出现时,所有的事情都会一团糟。首先,我无法根据第一个元素确定类型;其次,我无法再次使用列表对象诅咒类型擦除获取类型信息;第三,我无法使用sql.Array对象获取sql类型;第四,我无法创建独立于类型的空sql.Array。在我看来,如果将空数组传递给数据库,那么数据库应该根据它通常的类型来创建它。。。。所以一句话,我被绊倒了

我想知道maybody能帮我吗?我很好,爸爸


请给我

出于我的目的,我将数组映射到Set,它与PreparedStatement.setObject配合得非常好,作为空列表的一个选项,您可以执行以下操作:

@MappedTypes(List.class)
@MappedJdbcTypes({JdbcType.ARRAY})
public class ListTypeHandler extends BaseTypeHandler<List> {
 private static final String TYPE_NAME_UUID = "uuid";

 @Override
 public void setNonNullParameter(PreparedStatement ps, int i, List list, JdbcType jdbcType) throws SQLException {
   Connection conn = ps.getConnection();

   if(list.size() != 0) {
     Object[] parameter = list.toArray(new Object[0]);
     String typeName = null;
     // using a switch to determine how to map the Java type to the sql type
     if (list.get(0) instanceof UUID) {
       typeName = TYPE_NAME_UUID;
     }

     if (typeName == null) {
       throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
     }
     Array array = conn.createArrayOf(typeName, parameter);
     ps.setArray(i, array);
   } else {
     // here is the hard point
     ps.setArray(i, conn.createArrayOf("uuid", new Object[0]));
   }
 }

 private List getArray(Array array) {
   try {
     return Arrays.asList((Object[])array.getArray());
   } catch (Exception e) {
     return null;
   }

 }
}
if (list.isEmpty()) {
   ps.setObject(i, Collections.<Object>emptySet());
} else {
   //process non-empty list
}