Вставка int [] в PostgreSql с помощью iBatis - PullRequest
2 голосов
/ 14 января 2011

... есть ли простой способ вставить Java int [] в PostgreSql с помощью iBatis?(старый, а не новый MyBatis)

Не уверен, нужен ли мне обработчик нестандартного типа или нет, но мне трудно найти пример кода, который бы иллюстрировал происходящее.

Заранее спасибо.

ps:

с момента первоначальной публикации, я могу прочитать массив из БД и заполнить int [] в доменном объекте.Но пока не могу записать в БД: - (

, поэтому в модели предметной области есть:

int[] crap = null;

с геттерами и сеттерами, обработчик свойств cusom выглядит так:

public class ArrayTypeHandler implements TypeHandlerCallback {
public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {

    if( parameter == null){
        setter.setNull( Types.ARRAY);
    } else {
        setter.setArray( (Array) Arrays.asList(parameter ) );
    }

}

public Object getResult(ResultGetter getter) throws SQLException {
    Array array = getter.getResultSet().getArray(getter.getColumnName());
    if( !getter.getResultSet().wasNull()){
         return array.getArray();
    } else { return null; }

}

public Object valueOf(String string) {
    throw new UnsupportedOperationException("Not supported yet.");
}

}

sqlMapConfig.xml:

<typeHandler javaType="java.sql.Array" jdbcType="ARRAY" callback="project.persistance.sqlmapdao.ArrayTypeHandler"  />

При попытке обновления я получаю следующую ошибку:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];   

--- Произошла ошибкав проекте / persistance / sql_xml / Article.xml.
--- Произошла ошибка при применении карты параметров.
--- Проверьте updateArticle-InlineParameterMap.
--- Проверьте отображение параметров длясвойство 'crap'.
--- Причина: java.lang.NullPointerException; вложенное исключение - com.ibatis.common.jdbc.exception.NestedSQLException:
--- Произошла ошибка в проекте / persistance / sql_xml /Article.xml.
--- Произошла ошибка при применении карты параметров.
--- Проверьте updateArticle-InlineParameterMap.
--- Проверьте отображение параметров для свойства 'crap'.
--- Причина: java.lang.NullPointerException

... любые подсказки относительно wшляпа я скучаю?спасибо

===

... прошел путь до ClassCastExceptiong: -)

, пытаясь установить правильность:

    public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
    int[] c = (int[]) parameter;

    setter.setArray( (java.sql.Array) c  );
}

... и последующее исключение:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [null]; error code [0];   

--- Ошибка произошла в проекте / persistance / sql_xml / Article.xml.
--- Ошибка произошла при применении карты параметров.
--- Проверьте updateArticle-InlineParameterMap.
--- Проверьте соответствие параметров для свойства 'crap'.
--- Причина: java.lang.ClassCastException: java.util.ArrayList;Вложенное исключение - com.ibatis.common.jdbc.exception.NestedSQLException:
--- Произошла ошибка в проекте / persistance / sql_xml / Article.xml.
--- Произошла ошибка при применении карты параметров.
--- Проверьте updateArticle-InlineParameterMap.
--- Проверьте соответствие параметров для свойства 'crap'.
--- Причина: java.lang.ClassCastException: java.util.ArrayList

... у меня сегодня было все же.Спасибо

Ответы [ 3 ]

2 голосов
/ 14 января 2011
1 голос
/ 19 января 2011

... наконец-то получил.Вот как это происходило с самого начала:

... first: читает int []

... second: second, при поиске и спотыкании нашел реализация интерфейса java.sql.Array (только для jdk 1.6) и публикация в списке рассылки с 2005 .

Окончательная реализация метода setParameter вTypeHandlerCallbac iterface:

    public void setParameter(ParameterSetter setter, Object parameter) throws SQLException {
    setter.setArray( this.convertIntegerToPgSqlArray( (int[]) parameter ) );
}

...

    private java.sql.Array convertIntegerToPgSqlArray(final int[] p) {
    if (p == null || p.length < 1) {
        return null;
    }
    Array a = new Array() {

        public String getBaseTypeName() {
            return "int4";
        }

        public int getBaseType() {
            return 0;
        }

        public Object getArray() {
            return null;
        }

        public Object getArray(Map<String, Class<?>> map) {
            return null;
        }

        public Object getArray(long index, int count) {
            return null;
        }

        public Object getArray(long index, int count, Map<String, Class<?>> map) {
            return null;
        }

        public ResultSet getResultSet() {
            return null;
        }

        public ResultSet getResultSet(Map<String, Class<?>> map) {
            return null;
        }

        public ResultSet getResultSet(long index, int count) {
            return null;
        }

        public ResultSet getResultSet(long index, int count,
            Map<String, Class<?>> map) {
            return null;
        }

        public String toString() {
            String fp = "{";
            if (p.length == 0) {
            } else {
                for (int i = 0; i < p.length - 1; i++) {
                    fp += p[i] + ",";
                }
                fp += p[p.length - 1];
            }
            fp += "}";
            return fp;
        }
    };
        return a;
}

В конце концов, спасибо всем и надеюсь, что это спасет кого-то еще некоторое время: -)

PS: Просто в качестве окончательного FYI, когда я разместил вопрос всписок рассылки MyBatis, вот что я получил:

Несколько проблем с этим ...

  1. Arrays.asList () не работаетдля примитивных массивов.См. Здесь:

    http://code.google.com/p/mybatis/source/detail?r=3467

    Для того изменения, которое мы внесли в MyBatis 3 для работы с примитивными массивами.

  2. Тогда вы, вероятно, не сможете разыгратьсписок java.util.List для java.sql.Array.Чтобы создать массив java.sql.Array, вам потребуется использовать некоторую утилиту из драйвера JDBC или переключиться на JDK6 и использовать метод Connection.createArrayOf (...).

Поддержка типа ARRAY в JDBC - это полный беспорядок, смешивание его с примитивными массивами добавляет еще один слой беспорядка:)

1 голос
/ 17 января 2011

Основываясь на странице, на которую ссылается ответ Джереми, я недавно написал свой собственный обработчик (с некоторыми взломами).Если вы найдете это полезным:

public class ArrayIntsTypeHandlerCallback implements TypeHandlerCallback {

     /**
      * to write an integer array in db. Object should be Integer[]
      */    
      public void setParameter(ParameterSetter setter, Object parameter) throws SQLException  {
          Connection con = setter.getPreparedStatement().getConnection();
          // hack: if using poolable connection from dbcp must get inside true connection! 
          if(con instanceof org.apache.commons.dbcp.PoolableConnection ) {
              con =     ((org.apache.commons.dbcp.PoolableConnection)con).getInnermostDelegate();
          }
          Array array = con.createArrayOf("integer", (Object[])parameter);
          setter.setArray(array);
        }

      /**
       * read integer array from db. returns Integer[]
       */
      public Object getResult(ResultGetter getter) throws SQLException {
        Array array = getter.getArray();
        if (!getter.getResultSet().wasNull()) {
          return array.getArray();
        } else {
          return null;
        }
      }

      public Object valueOf(String s) {
        throw new UnsupportedOperationException("Not implemented");
      }


    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...