4

現在、PostgreSQL データベースと OrmLite を使用しています。Postgres hstoreを使用するユースケースができましたが、OrmLite を介してそのテーブルにアクセスする方法が見つかりません。その1つのテーブルを選択して挿入するためだけに別のデータベース接続を開くことは避けたいのですが、他のオプションは表示されません。

少なくとも、OrmLite が使用している既存の接続へのハンドルが必要なので、それを再利用して準備済みステートメントを作成できますがjava.sql.Connection、OrmLite ConnectionSource から開始する方法が見つかりませんでし. た。OrmLite にはJdbcCompiledStatementですが、これは a の単なるラッパーであり、コンストラクターに渡すPreparedStatement必要があります。PreparedStatement(そのユースケースが何であるかはわかりません。)

を使用しようとしましたが、DatabaseConnection.compileStatement(...)使用されているフィールド タイプの知識が必要であり、OrmLite は hstore が何であるかを認識していないようです。

を使用しようとしましupdateRaw()たが、その関数は私が持っていない OrmLite dao にのみ存在します。これは、dao をリンクするテーブルに OrmLite が認識しないフィールド タイプがあるためです。生のクエリを発行するための一般的な dao を取得する方法はありますか?

hstores はデータベース固有のものであり、おそらく OrmLite ではサポートされないことがわかりましたが、サポートされていないクエリだけでなく、サポートされていないフィールドを使用してデータベースとの間でデータを転送する方法を見つけたいと思っています。

4

3 に答える 3

2

ConnectionSourceは実際にはJdbcConnectionSourceによって実装されているようで、JdbcDatabaseConnectionを返す可能性があります。そのオブジェクトには、探しているもののように見えるgetInternalConnectionメソッドがあります。

于 2012-09-11T18:28:38.827 に答える
2

@Gray「その他」のデータ型を有効にできるORMLiteパッチをSourceForgeに送信しました。パッチ 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 ConnectionSourceJdbcConnectionSource. を使用してそのクラスから接続をconnectionSource.getReadOnlyConnection()取得するDatabaseConnectionと、実際には であり、JdbcDatabaseConnectionそれにキャストできる が得られます。JdbcDatabaseConnection.getInternalConnection()関連する を返すメソッドがありますjava.sql.Connection

updateRaw() を使用しようとしましたが、その関数は私が持っていない OrmLite dao にしか存在しません ...

任意の DAO クラスを使用して、任意のテーブルで生の関数を実行できます。これは、DAO オブジェクトのテーブルに対する構造化されていない更新と考えると便利です。ただし、DAO がある場合は、他のテーブルに対して生の更新を実行できます。

サポートされていないクエリだけでなく、サポートされていないフィールドを使用してデータベースとの間でデータを転送する方法を見つける

サポートされていないフィールドを使用している場合は、未加工のステートメントとして実行する必要があります (または のいずれSELECTか) UPDATE。試した生のステートメントを表示するように投稿を編集していただければ、より具体的にお手伝いできます。

于 2012-09-11T19:40:45.800 に答える