Есть ли способ использовать OrmLite с хранилищами Postgres?

В настоящее время мы используем базу данных PostgreSQL и OrmLite. Теперь у нас есть вариант использования хранения Postgres, но мы не можем t найти какой-либо способ доступа к этой таблице через OrmLite. Я бы предпочел не открывать отдельное соединение с базой данных только для выбора и вставки в эту таблицу, но других вариантов я не вижу.

По крайней мере, мне нужен дескриптор существующего соединения, которое использует OrmLite, чтобы я мог повторно использовать его для создания подготовленного оператора, но я не нашел способа получить java.sql.Connection, начиная с OrmLite ConnectionSource. . Я вижу, что OrmLite имеет JdbcCompiledStatement, но это всего лишь оболочка вокруг PreparedStatement и требует, чтобы PreparedStatement передавалось в конструктор. (Не знаю, как это использовать.)

Я пытался использовать DatabaseConnection.compileStatement(...), но для этого требуется знание используемых типов полей, а OrmLite, похоже, не знает, что такое hstore.

Я пытался использовать updateRaw(), но эта функция существует только в дао OrmLite, которого у меня нет, потому что таблица, с которой я бы связал дао, имеет тип поля, который OrmLite не распознает. Есть ли способ заставить общий дао выдавать необработанные запросы?

Я понимаю, что hstores специфичны для базы данных и, вероятно, не будут поддерживаться OrmLite, но мне бы очень хотелось найти способ передачи данных в базу данных и из базы данных с использованием неподдерживаемых полей, а не просто неподдерживаемых запросов.


person Tim Gautier    schedule 11.09.2012    source источник
comment
+1 за то, что попробовал так много всего, Тим. Я не слышал о hstores до сих пор. дай мне почитать...   -  person Gray    schedule 11.09.2012


Ответы (3)


По крайней мере, мне нужен дескриптор существующего соединения, которое использует OrmLite, чтобы я мог повторно использовать его для создания подготовленного оператора...

Хорошо, это довольно легко. Как упоминал @jsight, ORMLite ConnectionSource для JDBC — это JdbcConnectionSource. Когда вы получите соединение от этого класса с помощью connectionSource.getReadOnlyConnection(), вы получите DatabaseConnection, который на самом деле является JdbcDatabaseConnection и может быть приведен к нему. Существует JdbcDatabaseConnection.getInternalConnection() метод, который возвращает связанный java.sql.Connection.

Я пытался использовать updateRaw(), но эта функция существует только в дао OrmLite, которого у меня нет...

Вы действительно можете использовать любой класс DAO для выполнения необработанной функции в любой таблице. Удобно думать об этом как о неструктурированном обновлении таблицы объекта DAO. Но если у вас есть какой-либо DAO, вы можете выполнить необработанное обновление любой другой таблицы.

найти способ передачи данных в базу данных и из базы данных с использованием неподдерживаемых полей вместо просто неподдерживаемых запросов

Если вы используете неподдерживаемые поля, вам придется сделать это как необработанный оператор — либо SELECT, либо UPDATE. Если вы отредактируете свой пост, чтобы показать необработанный оператор, который вы пробовали, я могу помочь более конкретно.

person Gray    schedule 11.09.2012
comment
Извините, я не имел в виду, что updateRaw недоступен на моем дао. Я имел в виду, что у меня нет dao, потому что я не могу аннотировать поле в моем классе, которое представлено в базе данных, с помощью hstore. Без аннотаций классов нет дао. Насколько я знаю. Я не совсем понимаю, почему выдача необработанных запросов выполняется на уровне дао. Запрос может заключаться в объединении нескольких таблиц или в доступе к совершенно другой таблице, чем предполагает дао, верно? - person Tim Gautier; 11.09.2012
comment
Хороший вопрос @ Тим. Люди используют ORMLite для хранения учетных записей в базе данных. Иногда им нужно выполнять неструктурированные запросы, следовательно, необработанный метод запроса в Dao, хотя на самом деле вы можете использовать любой DAO для выполнения запроса. Кроме того, в DAO есть много кода для подключения к базе данных, который необходимо использовать. - person Gray; 12.09.2012

Похоже, что ConnectionSource на самом деле может быть реализован JdbcConnectionSource и, скорее всего, вернет JdbcDatabaseConnection. Этот объект имеет метод getInternalConnection, который похож на то, что вы ищете.

person jsight    schedule 11.09.2012

@Gray Я представил патч ORMLite на SourceForge, который может включить тип данных «Другой». Идентификатор исправления — 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)
person mrog    schedule 11.09.2012
comment
Упомянутый выше патч будет включен в версию 4.42 ORMLite. - person mrog; 19.09.2012