4

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

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

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

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

我知道 hstore 是特定于数据库的,OrmLite 可能不支持,但我真的很想找到一种方法来使用不受支持的字段而不是仅不受支持的查询将数据传输到数据库和从数据库传输数据。

4

3 回答 3

2

听起来 ConnectionSource 可能实际上是由 JdbcConnectionSource 实现的,并且可能会返回一个 JdbcDatabaseConnection。该对象有一个 getInternalConnection 方法,看起来像您要查找的内容。

于 2012-09-11T18:28:38.827 回答
2

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

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

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

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

最后,用户需要注释他们的数据才能使用持久化器。

@DatabaseField(columnName = "myData", persisterClass=PGHStorePersister.class)
于 2012-09-11T22:27:09.587 回答
1

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

好的,这很容易。正如@jsight 提到的,用于 JDBC的ORMLite 是. 当您使用 获得该类的连接时,您将获得真正的 a并且可以转换为它。有一种方法可以返回关联的.ConnectionSourceJdbcConnectionSourceconnectionSource.getReadOnlyConnection()DatabaseConnectionJdbcDatabaseConnectionJdbcDatabaseConnection.getInternalConnection()java.sql.Connection

我尝试使用 updateRaw(),但该函数仅存在于我没有的 OrmLite dao 上...

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

找到一种使用不受支持的字段而不是仅使用不受支持的查询将数据传入和传出数据库的方法

如果您使用的是不受支持的字段,那么您将不得不将其作为原始语句进行 - 要么SELECT要么UPDATE. 如果您编辑帖子以显示您尝试过的原始陈述,我可以提供更具体的帮助。

于 2012-09-11T19:40:45.800 回答