2016-10-26 3 views
1

ВведениеКак я могу получить данные из таблицы, у которой нет модели?

Я работаю над проектом, и я противостоял странный случай использования, что может быть ActiveJDBC не предназначен для, я обязуюсь терпения, потому что многие вещи в этом проекте не в моей власти:

У меня есть от 10 до 15 небольших/средних баз данных (~ 30 таблиц каждая, максимум 40000 записей), и большинство из них разделяют «основную» схему из 15 таблиц, но в то же время у них есть определенные таблицы, уникальные для каждой базы данных. все из которых поддерживаются унаследованными системами, к которым у меня нет доступа.

Цель

Мы (я и некоторые conrades) необходимо централизовать данные в своего рода «convolunted хранилища данных». К сожалению, по более высоким причинам я не могу использовать какие-либо технологии, отличные от ActiveJDBC, и все, что нужно написать нам (я знаю, что с MongoDB и/или Liquibase лучше справиться с этим)

Мы уже обрабатывали соединение между Базами данных, и сам проект идет хорошо для большей части. Часть программы, которая обрабатывает основную схему, которую все базы данных разделяют, уже «работает», но у нас возникают проблемы с их уникальными таблицами.

Я получаю все имена таблиц из баз данных из запроса, который выполняется во время выполнения (не мой выбор). Нам необходимо, чтобы число классов, как минимум, предпочтительно

Наконец мой вопрос

Могу ли я создать Generic/Динамическая модель или что-то подобное, что может содержать данные из запроса во время выполнения? что-то вроде:

Model a = Base.findall("select * from ?", TableName) 

или

Model a = Model.fromTable(Tablename) 

Я знаю, что это странно использовать модель, что путь, но это было бы упростить нашу жизнь так сильно, если бы мы могли получить данные Таблица таким образом.

Мы будем использовать эту модель в основном для получения «сырых» данных из таблиц и удовлетворения интерфейсов, поэтому не нужно беспокоиться о каждой связи таблицы прямо сейчас.

Спасибо заранее

@Edit: Спасибо Игорю за этот удивительный инструмент!

Мы вроде как сделали (почти)! Спасибо. Мы использовали подобный подход для «основной схемы», но вы немного дали нам немного света.

Как я заметил:

Мы должны использовать результаты Base.findall(), как это было модели, это было бы возможно?

ответ

1

Вы находитесь в угощении. Я чувствую от вашей ссылки на ActiveJDBC, что это не ваш выбор, но вы будете удивлены его гибкостью. Позвольте мне сначала отбросить пару вещей: MongoDB не является базой отношений, а Liquibase - системой миграции БД. JavaLite обеспечивает гораздо проще DB-Migrator.

Теперь, к мясу ответа. Как вы уже знаете, ActiveJDBC - это действительно карта на стероидах. Это означает, что вы можете сделать это:

Person p = new Person(); 
p.fromMap(aMap); 

См, метод Model#fromMap(Map) считывает атрибуты из карты, если они соответствуют именам атрибутов этой модели и переписывает его значение значений из карты.

Позволяет написать код:

Например, есть таблица называется НАРОД в первой базе данных, и пользователей в «другой» базы данных, такие, что:

create table USERS(first_name VARCHAR(56)); 
create table PEOPLE(firstname VARCHAR(56)); 

Как вы можете видеть, " есть первое название»столбцы в обеих базах данных/таблицах, но имеют разные имена

Таким образом, позволяет писать код для чтения из ПОЛЬЗОВАТЕЛЕЙ и сохранить ЧЕЛОВЕК:

// define model 
public class Person extends Model {} 

... 

Base.open(...) // open default database 
DB otherDB = new DB("other_database"); 
otherDB.open(...); // open other database 

// read users from "other" database 
List<Map> users = db.findAll("select first_name \"firstname\" from users"); 

// save people into default database 
for(Map user: users){ 
    Person p = new Person(); 
    p.fromMap(user); 
    p.saveIt; 
} 

Base.close(); 
otherDb.close(); 

Надеюсь, это решает вашу проблему!

+0

Дополнительный вопрос на мини-вопрос: Можно ли каким-либо образом использовать «where(). Limit(). Offset()» с base.findall? Я знаю, что могу передать их непосредственно по запросу, но мне нужно отфильтровать объекты после того, как я получил результаты – LouizFC

+1

, чтобы сделать это внутри базы данных, так как findAll() берет необработанный SQL-запрос: 'db.findAll (" выберите first_name "first_name" из списка пользователей по имени first_name limit 10 offset 50 ")' – ipolevoy

+1

@LouizFC, спасибо за хорошее слово! К вашему другому вопросу: «Нам нужно использовать результаты Base.findall(), подобные модели, возможно ли это?». Результатами методов «Base # find» являются карты или списки карт. Ключи - это ваши выборки из вашей базы данных, а значения - все, что возвращает драйвер JDBC в соответствии с отображением вашей базы данных на типы Java. Таким образом, результаты Base не являются моделями. Однако, как я показал, вы можете легко преобразовать эти результаты в модели. – ipolevoy