2011-01-14 2 views
2

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

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

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

пс:

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

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

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]; 

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

... любые подсказки относительно того, что мне не хватает? благодаря

===

... работал мой путь до 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]; 

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

... У меня было это сегодня. Благодаря

+2

ли Вы хотите вставить 'ИНТ []' в одной строке или mupliple row? – Nishant

+0

одна строка, тип col целое [] – vector

ответ

1

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

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"); 
     } 


    } 
+0

... это можно сделать только с помощью jdk 1.6 или он совместим с 1.5? – vector

+0

IIRC 'createArrayOf' поставляется с JDBC-4, который поставляется с JDK 1.6 – leonbloy

1

... получил его окончательно. Вот как это пошло с самого начала:

... первый: reading the int[]

... второй: второй, при поиске и спотыкаясь нашли implementation of the java.sql.Array interface (JDK 1.6 только, хотя) и размещение на mailing list from 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, вот что я вернулся:

Several problems with this...

  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 является полным беспорядком, смешивая его с примитивными массивами добавляет целый другой слой беспорядочности :)

Смежные вопросы