有没有办法使用OrmLite与Postgres hstores?

我们目前正在使用PostgreSQL数据库和OrmLite。 我们现在有一个使用Postgres hstore的用例,但是找不到通过OrmLite访问该表的任何方法。 我宁愿避免打开一个单独的数据库连接只是为了选择并插入到那一个表,但我没有看到任何其他选项。

至少我想要一个OrmLite正在使用的现有连接的句柄,所以我可以重用它来构建一个准备好的语句,但我还没有找到一种从OrmLite ConnectionSource开始获取java.sql.Connection的方法. 我看到OrmLite有一个JdbcCompiledStatement ,但这只是PreparedStatement的包装器,需要将PreparedStatement传递给构造函数。 (不确定用例是什么。)

我尝试使用DatabaseConnection.compileStatement(...) ,但这需要了解正在使用的字段类型,OrmLite似乎不知道hstore是什么。

我曾尝试使用updateRaw() ,但该函数仅存在于我没有的OrmLite dao上,因为我将链接dao的表具有OrmLite无法识别的字段类型。 有没有办法让genericsdao发出原始查询?

我认为hstore是特定于数据库的,OrmLite可能不会支持,但我真的想找到一种方法,使用不受支持的字段而不仅仅是不支持的查询,将数据传入和传出数据库。

至少我想要一个OrmLite正在使用的现有连接的句柄,所以我可以重用它来构建一个准备好的语句……

好的,这很简单。 正如@jsight所提到的,JDBC的ORMLite ConnectionSourceJdbcConnectionSource 。 当您使用connectionSource.getReadOnlyConnection()从该类获得连接时,您将获得一个实际上是JdbcDatabaseConnectionDatabaseConnection ,并且可以将其JdbcDatabaseConnection为它。 有一个JdbcDatabaseConnection.getInternalConnection()方法,它返回关联的java.sql.Connection

我试过使用updateRaw(),但是这个函数只存在于我没有的OrmLite dao上……

您真的可以使用任何DAO类在任何表上执行原始函数。 可以很方便地将其视为对DAO对象表的非结构化更新。 但是如果你有任何DAO,你可以在任何其他表上执行原始更新。

找到一种使用不受支持的字段而不仅仅是不受支持的查询与数据库之间传输数据的方法

如果您使用不受支持的字段,那么您将不得不将其作为原始语句 – SELECTUPDATE 。 如果您编辑post以显示您尝试过的原始语句,我可以更具体地帮助您。

听起来,ConnectionSource实际上可能是由JdbcConnectionSource实现的,并且可能会返回JdbcDatabaseConnection。 该对象有一个看起来像你正在寻找的getInternalConnection方法。

@Gray我在SourceForge上提交了一个ORMLite补丁,它可以启用“其他”数据类型。 修补程序ID为3566779.使用此修补程序,可以支持hstores。

用户需要将PGHStore类添加到他们的项目中。 这个类的代码在这里 。

用户还需要添加一个persister类,如下所示:

 package com.mydomain.db.persister; import com.mydomain.db.PGHStore; import com.j256.ormlite.field.FieldType; import com.j256.ormlite.field.SqlType; import com.j256.ormlite.field.types.BaseDataType; import com.j256.ormlite.support.DatabaseResults; import java.sql.SQLException; public class PGHStorePersister extends BaseDataType { private static final PGHStorePersister singleton = new PGHStorePersister(); public static PGHStorePersister getSingleton() { return singleton; } protected PGHStorePersister() { super(SqlType.OTHER, new Class[] { PGHStore.class }); } protected PGHStorePersister(SqlType sqlType, Class[] classes) { super(sqlType, classes); } @Override public Object parseDefaultString(FieldType ft, String string) throws SQLException { return new PGHStore(string); } @Override public Object resultToSqlArg(FieldType fieldType, DatabaseResults results, int columnPos) throws SQLException { return results.getString(columnPos); } @Override public Object sqlArgToJava(FieldType fieldType, Object sqlArg, int columnPos) throws SQLException { return new PGHStore((String) sqlArg); } @Override public boolean isAppropriateId() { return false; } } 

最后,用户需要注释他们的数据才能使用persister。

 @DatabaseField(columnName = "myData", persisterClass=PGHStorePersister.class)