2016-10-26 12 views
1

はじめモデルを持たないテーブルからデータを取得するにはどうすればよいですか?

私はプロジェクトに取り組んでいると私は多分ActiveJDBCがために意図されていない奇妙なユースケースに直面し、このプロジェクトでは、多くの物事が私のコントロールに含まれていないので、私は忍耐を誓う:

私は10〜15個の小/中規模データベース(それぞれ〜30個のテーブル、最大40000個のレコード)を持っており、それらの大半は15個のテーブルの「コア」スキーマを共有しますが、同時に各データベースに固有のいくつかの特定のテーブルがあります。すべて私がアクセスできないレガシーシステムによって維持されています。

ゴール

私たち(私といくつかのコンレイデス)は「convoluntedデータウェアハウス」の種類のデータを一元管理する必要があります。残念なことに、ActiveJDBC以外のテクノロジーは使用できません。私たちが書き込む必要があるものは他にありません。(私はMongoDBやLiquibaseでこれをうまく処理できることを知っています)

すでに接続を処理していますデータベース間で、プロジェクト自体はほとんどの場合うまくいっています。すべてのデータベースが共有しているコアスキーマを処理するプログラムの部分はすでに「機能しています」が、ユニークなテーブルには問題があります。

私はデータベースからすべてのテーブル名を実行時に作成されたクエリから取得します(私の選択でもありません)。私たちは、好ましくは

最後に、私の質問

が、私は、実行時にクエリからのデータを保持することができる、汎用/動的モデルまたは類似のものを作成することはできますか?最低でもクラスの数を維持する必要がありますか以下のようなもの:

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

または

Model a = Model.fromTable(Tablename) 

私はそのようにモデルを使用することが奇妙である知っているが、我々は表のデータをそのように取得することができればそれはそんなに私たちの生活を簡素化します。

この種類のモデルを使用して、ほとんどの場合、テーブルから「生の」データを取得し、インターフェイスを満足させるため、今は各テーブルの関係について心配する必要はありません。アドバンス

@Editで

ありがとう:この素晴らしいツールのためにあなたのイゴールをありがとう!

ちょっと(ほとんど)!ありがとうございました。私たちは "コアスキーマ"のために同様のアプローチを使用していましたが、ちょっと光りました。

私がコメントしたよう:それはモデルだったよう

我々はBase.findall(の結果を使用する必要がある)、それは可能でしょうか?

答えて

1

あなたは治療中です。 ActiveJDBCへのあなたの言及から、これはあなたの選択ではないと感じていますが、その柔軟性に驚くでしょう。 MongoDBはリレーションデータベースではなく、LiquibaseはDBマイグレーションシステムです。 JavaLiteははるかに簡単なDB-Migratorを提供します。

今、答えの肉に。あなたがすでに知っているように、ActiveJDBCは本当にステロイドのマップです。これは、あなたがこれを行うことができます意味:

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

を参照してください、限り、彼らはこのモデルの属性の名前に対応し、マップからの値によって、その値を上書きするようなマップから属性を読み取りModel#fromMap(Map)方法。

いくつかのコードを書くことができます:

たとえば、テーブルがあるが、最初のデータベースの人々と呼ばれ、「その他」のデータベースようでUSERS:

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

あなたが見ることができるように、 "最初の名前」列が両方のデータベース/テーブルに存在するが、そう異なる名前

を持って、USERSから読み取られ、人々に保存するようにコードを書くことができます:

// 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

追加のミニ質問:base.findallに何らかの方法で "where()。limit()。offset()"を使用できますか?私はfindAll()が生のSQLクエリを取るので、結果を – LouizFC

+1

というようにデータベース内で処理した後に、フィルタリングする必要があります。 'db.findAll(" first_name "first_name"をfirst_name limit 10 offset 50で注文してください) " – ipolevoy

+1

@LouizFC、良い言葉をありがとう!あなたのもう一つの質問には:「Model.Findall()の結果をモデルと同じように使用する必要がありますか?」 'Base#find'メソッドの結果は、マップまたはマップのリストです。キーはデータベースからの選択です。値は、JDBCドライバがデータベースのJava型へのマッピングに従って返す値です。したがって、Baseからの結果はモデルではありません。しかし、私が示したように、それらの結果を簡単にモデルに変換することができます。 – ipolevoy

関連する問題