Java 有没有办法在Postgres商店中使用OrmLite?
我们目前正在使用PostgreSQL数据库和OrmLite。我们现在有了一个使用的用例,但是找不到任何通过OrmLite访问该表的方法。我希望避免打开单独的数据库连接只是为了选择并插入一个表,但我看不到任何其他选项 至少我想要一个OrmLite正在使用的现有连接的句柄,这样我就可以重用它来构建一个准备好的语句,但是我还没有找到一种从OrmLite ConnectionSource开始获取java.sql.connection的方法。 我看到OrmLite有一个JdbcCompiledStatement,但它只是PreparedStatement的包装器,需要将PreparedStatement传递给构造函数。不确定这是什么用例 我曾尝试使用DatabaseConnection.compileStatement…,但这需要了解所使用的字段类型,而OrmLite似乎不知道什么是hstore 我尝试过使用updateRaw,但该函数只存在于我没有的OrmLite dao上,因为我要链接dao的表有一个字段类型OrmLite无法识别。有没有办法让一个泛型dao发出原始查询Java 有没有办法在Postgres商店中使用OrmLite?,java,postgresql,ormlite,Java,Postgresql,Ormlite,我们目前正在使用PostgreSQL数据库和OrmLite。我们现在有了一个使用的用例,但是找不到任何通过OrmLite访问该表的方法。我希望避免打开单独的数据库连接只是为了选择并插入一个表,但我看不到任何其他选项 至少我想要一个OrmLite正在使用的现有连接的句柄,这样我就可以重用它来构建一个准备好的语句,但是我还没有找到一种从OrmLite ConnectionSource开始获取java.sql.connection的方法。 我看到OrmLite有一个JdbcCompiledStatem
我知道HStore是特定于数据库的,OrmLite可能不支持它,但我真的很想找到一种方法,使用不受支持的字段,而不仅仅是不受支持的查询,在数据库之间传输数据。听起来ConnectionSource实际上可能是由JdbcConnectionSource实现的,并可能返回JdbcDatabaseConnection。该对象有一个getInternalConnection方法,该方法与您要查找的方法类似 至少我想要一个OrmLite正在使用的现有连接的句柄,这样我就可以重用它来构建一个准备好的语句 好的,那很容易。正如@jsight所提到的,JDBC的ConnectionSource是JdbcConnectionSource。当您使用connectionSource.getReadOnlyConnection从该类获得连接时,您将获得一个数据库连接,它实际上是一个JdbcDatabaseConnection,可以强制转换到它。有一个方法返回关联的java.sql.Connection 我尝试过使用updateRaw,但该函数只存在于我没有的OrmLite dao上 您确实可以使用任何DAO类在任何表上执行原始函数。可以方便地将其视为对DAO对象表的非结构化更新。但是,如果您有任何DAO,您可以对任何其他表执行原始更新 找到一种方法,使用不受支持的字段(而不仅仅是不受支持的查询)在数据库之间传输数据
如果您使用的是不受支持的字段,那么您必须将其作为原始语句执行—SELECT或UPDATE。如果您编辑您的帖子以显示您尝试过的原始语句,我可以提供更具体的帮助。@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;
}
}
+蒂姆,谢谢你尝试了这么多东西。我以前从未听说过商店。让我读一读……对不起,我不是有意暗示我的dao上没有updateRaw。我的意思是我没有dao,因为我不能在类中用hstore注释数据库中表示的字段。没有类注释,就没有dao。据我所知。我不太明白为什么要在dao级别发出原始查询。查询可以将多个表连接在一起,或者访问一个与dao所暗示的完全不同的表,对吗?Good point@Tim。人们使用ORMLite在数据库中存储帐户。有时,它们需要执行非结构化查询,因此需要在Dao上使用原始查询方法,尽管实际上您可以使用任何Dao来执行查询。此外,DAO还有很多需要使用的数据库连接代码。上面提到的补丁将包含在ORMLite的4.42版中。
@DatabaseField(columnName = "myData", persisterClass=PGHStorePersister.class)