我一直在努力将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 [],但表达式的类型为字符变化提示:你 将需要重写或转换表达式。
答案 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
类型不匹配的情况下通过此特定错误。