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

时间:2012-09-11 17:23:16

标签: java postgresql ormlite

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

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

用户需要将PGHStore类添加到他们的项目中。此类的代码为here

用户还需要添加一个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;
    }
}

最后,用户需要注释他们的数据以使用持久性。

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

答案 2 :(得分:1)

  

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

好的,这很简单。正如@jsight所提到的,JDBC的ORMLite ConnectionSourceJdbcConnectionSource。当您使用connectionSource.getReadOnlyConnection()从该课程获得连接时,您将获得一个真正为DatabaseConnection的{​​{1}}并可以投射到该JdbcDatabaseConnection。有JdbcDatabaseConnection.getInternalConnection()方法可返回关联的java.sql.Connection

  

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

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

  

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

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