Ormlite和PostgreSQL - 插入带有自定义persister的文本数组时出错

时间:2014-08-15 18:51:43

标签: postgresql ormlite

我一直在努力将Ormlite设置为PostgreSQL数据库和Java应用程序之间的主要数据访问层。一切都相当简单,直到我开始搞乱PostgreSQL的数组类型。在我的例子中,我有两个表使用text []数组类型。在文档之后,我创建了一个自定义数据持久性,如下所示:

public class StringArrayPersister extends StringType {

    private static final StringArrayPersister singleTon = new StringArrayPersister();

    private StringArrayPersister() {
        super(SqlType.STRING, new Class<?>[]{String[].class});
    }

    public static StringArrayPersister getSingleton() {
        return singleTon;
    }


    @Override
    public Object javaToSqlArg(FieldType fieldType, Object javaObject) {
        String[] array = (String[]) javaObject;


        if (array == null) {
            return null;
        } else {

            String join = "";
            for (String str : array) {
                join += str +",";
            }

            return "'{" + join.substring(0,join.length() - 1) + "}'";
        }

    }

    @Override
    public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) {
        String string = (String) sqlArg;

        if (string == null) {
            return null;
        } else {
            return string.replaceAll("[{}]","").split(",");
        }
    }
}

然后在我的业务对象实现中,我在列Likeo上设置了persister类:

   @DatabaseField(columnName = TAGS_FIELD, persisterClass = StringArrayPersister.class)
    private String[] tags;

当我尝试使用Dao.create语句插入新记录时,我收到一条错误消息,指出标签的类型为text [],但字符有所不同......但是,当从数据库查询现有记录时,业务对象(和文本数组)加载就好了。

有什么想法吗?

更新

PostGresSQL 9.2。确切的错误消息:

  

引起:org.postgresql.util.PSQLException:ERROR:column&#34; tags&#34;是   类型为text [],但表达式的类型为字符变化提示:你   将需要重写或转换表达式。

1 个答案:

答案 0 :(得分:2)

之前我没有使用 ormlite (我通常使用 MyBatis ),但是,我认为近端问题是这段代码:

 private StringArrayPersister() {
        super(SqlType.STRING, new Class<?>[]{String[].class});
    }

SqlType.String映射到 ormlite 代码中 SQL 中的varchar,因此我认为是您错误的近因#39;得到。有关详细信息,请参阅ormlite SQL Data Types info

尝试将其更改为:

private StringArrayPersister() {
        super(SqlType.OTHER, new Class<?>[]{String[].class});
    }

可能还需要进行其他调整以使其完全启动并运行,但这会导致您在varchar类型不匹配的情况下通过此特定错误。