【问题标题】:Is there any way to use OrmLite with Postgres hstores?有没有办法将 OrmLite 与 Postgres hstores 一起使用?
【发布时间】:2012-09-11 17:23:16
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • +1 尝试了这么多东西,蒂姆。我以前没有听说过hstores。让我看书……

标签: java postgresql ormlite


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    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)
    

    【讨论】:

    • 上述补丁将包含在ORMLite 4.42版本中。
    【解决方案3】:

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

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

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

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

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

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

    【讨论】:

    • 抱歉,我并不是要暗示 updateRaw 在我的 dao 上不可用。我的意思是我没有 dao,因为我无法在我的类中用 hstore 来注释数据库中表示的字段。没有类注解,就没有 dao。据我所知。我不太明白为什么在 dao 级别发出原始查询。该查询可能将多个表连接在一起,或者访问与 dao 所暗示的完全不同的表,对吗?
    • 好点@Tim。人们使用 ORMLite 将 Accounts 存储在数据库中。有时他们需要进行非结构化查询,因此使用 Dao 上的原始查询方法,尽管实际上您可以使用 any DAO 来进行查询。另外,DAO 有很多数据库连接代码需要用到。
    猜你喜欢
    • 2020-07-07
    • 2018-03-15
    • 2016-11-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多