代码之家  ›  专栏  ›  技术社区  ›  Ukonn Ra

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

  •  0
  • Ukonn Ra  · 技术社区  · 6 年前

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

    你知道Postgres有一种很棒的类型 ARRAY ,但创建 java.sql.Array java.sql.Connection:createOf(typeName, 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;
       }
    
     }
    }
    

    因为没有输入 JAVAsql。大堆 两者都不在列表中(因为fxcking擦除),而且我的数据库中有许多不同类型的数组,所以我必须制定一个统一的 TypeHandler类型处理程序 处理 Array List 关系

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

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

    我想知道maybody能帮我吗?我是Sooooooo Dadddddddddd。。。。。

    请或。。。。。。。。。。。。。。。。。。。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Roman-Stop RU aggression in UA    6 年前

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

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