0

私はクラスを取得しました:

 class Person{ 
   String name; 
   String surname; 
   String miasto; 
 }

そして、このクラスのオブジェクトをデータベーステーブルの単一のセルに入れたいと思います。これを行う方法はありますか?どのように?

4

3 に答える 3

5

hstoremuとして使用する代わりに、説明が短すぎるためhstore、複合型、Javaシリアル化bytea、およびがありxmlます。

hstoreの方がおそらく良い選択だと思いますが、これは実行可能な代替手段であり、一部の用途には適している可能性があります。何をしようとしているのか、そしてその理由を説明していないので、どちらか一方を推奨するのは難しいです。

上記の各オプションの説明は次のとおりです。

複合型

複合型は構造化され、強く型付けされており、クエリが簡単で、表現力があり、高速で、型システムの全機能を保持しているため、あらゆる種類の複雑な値や配列などを含めることができます。ただし、アプリケーションコードからテキスト形式でクエリを実行して書き込むのは非常に面倒なので、多くの場合、それらを操作するために追加のクエリを送信することになります。

JPAやHibernateのような他のORMからそれらを使用することさえ考えないでください-それらはそれらの@Embeddedクラスで複合型をサポートすると思うでしょうが、あなたは間違っているでしょう。

使用後に複合型を追加または変更しようとするのは、本当に苦痛な経験です。心に留めておきます。

CREATE TYPE person AS ( name text, surname text, miasto text );

CREATE TABLE some_table (id integer primary key, blah text, this_person person);

INSERT INTO some_table(id,blah,this_person)
VALUES (1,'fred',ROW('a','b','c'));

SELECT (this_person).name FROM some_table;

アクセス方法:

regress=# SELECT * FROM some_table ;
 id | blah | this_person 
----+------+-------------
  1 | fred | (a,b,c)
(1 row)

または、複合型の行構文を解析する必要をなくすには、次のようにします。

regress=# SELECT t.id, t.blah, (t.this_person).* FROM some_table t;
 id | blah | name | surname | miasto 
----+------+------+---------+--------
  1 | fred | a    | b       | c
(1 row)

または別のSELECTとして:

regress=# SELECT (t.this_person).* FROM some_table t;
 name | surname | miasto 
------+---------+--------
 a    | b       | c
(1 row)

XML

XMLデータ型は、SQL/XML標準を実装します。リッチでポータブルです。SQL / XMLはxpath、XML値のクエリをサポートします。構造化されたXMLデータに対して、非常に複雑で強力なクエリを記述できます。XMLは、ほとんどのアプリケーションで簡単に操作できます。Javaでは、 JAXBとJAXBアノテーションを使用して、ネイティブJavaオブジェクトから簡単にマーシャリングおよびアンマーシャリングできます。

XMLを使用するために、JavaやPgの拡張機能は必要ありません。

XML値は構造化されていますが、タイプは構造化されていません。整形式の自由形式のXMLドキュメントまたはフラグメントを受け入れます。IS DOCUMENTフラグメントを禁止する制約を追加します。より厳密な構造を強制することは苦痛です。AFAIK Pgは現在、データベース内のXML DSDまたはその他のスキーマ定義に対してXMLを検証できないため、構造を強制するには、厄介で遅いxpath制約が必要です。

XML値は入力されず、値は文字列として格納されます。

CREATE TABLE some_table (id integer primary key, blah text, this_person xml);

INSERT INTO some_table(id,blah,this_person)
VALUES (1,'fred', '<person><name>a</name><surname>b</surname><miasto>c</miasto></person>');

SELECT (xpath('/person/name/text()', this_person))[1] from some_table ;

JSON

JSONは、多くの言語やアプリケーションで広く理解されている標準形式です。作業はかなり簡単です。PgでのJSONのサポートは非​​常に新しく、現在、JSONを操作およびクエリするための関数や演算子がないため、現時点ではデータベースに対してかなり不透明です。「「name」キーが「a」で始まるjsonオブジェクトを検索する」のようなクエリを作成することはできません。9.3で改善することを期待してください。

JSONサポートはコアJavaSDKには存在しませんが、いくつかのライブラリから利用できます。その多くは、JAXBバインディング拡張を介したPOJOへのマーシャリング/アンマーシャリングをサポートしています。たとえば、JacksonのJAXBサポートを参照してください。

JSONタイプは、整形式のJSONドキュメントを受け入れます。特定の構造を強制する方法はありません。JSON値は型指定されますが、JSONでサポートされている限られた型のセットのみが受け入れられ、それ以外はすべて文字列として保存する必要があります。

-- in Pg 9.2 and above; for 9.1 use the json91 backport
CREATE EXTENSION json;

CREATE TABLE some_table (id integer primary key, blah text, this_person json);

INSERT INTO some_table(id,blah,this_person)
VALUES (1,'fred', '{"name": "a", "surname":"b", "miasto":"c"}');

-- No easy way to subscript out json values in 9.1, but it's very convenient
-- with any app that has json support.

HSTORE

hstoreは強力で、データをクエリするときに使用できる多くの優れた述語と演算子を提供します。ただし、この形式は非標準であり、アプリケーションコードで操作するのは面倒な場合があります。JDBCを使用している場合、org/postgresql/util/HStoreConverter.javaおよびPgJDBChstoreのサポートが少し役立ちます。

タイプは任意の値hstoreを受け入れhstoreます。CHECK構造は制約を介して強制される場合があります。hstore値はテキストです。hstoreにはデータ型はありません。

-- In Pg 9.1 and above; for older versions hstore is available but is
-- added differently. See the documentation.
CREATE EXTENSION hstore;

CREATE TABLE some_table (id integer primary key, blah text, this_person hstore);

INSERT INTO some_table(id,blah,this_person)
VALUES (1,'fred', hstore(ARRAY['name','surname','miatso'], ARRAY['a','b','c']));

SELECT this_person -> 'name' from some_table ;

Javaでのバイナリへのシリアル化

値がデータベースに対して完全に不透明であるため、おそらく最も優れたオプションですが、Javaで値をシリアル化byteaして、DBのように保存することもできます。

クラスが変更されるたびに、データベースに残っている古いバージョンのクラスを処理するためのカスタム逆シリアル化ルーチンを作成する必要があります。Java以外のコードは値を処理できず、データベース内でクエリを実行することはできません。

-

これで何を達成しようとしているのか、そしてその理由を説明できれば、本当に助かります。

于 2012-08-27T00:04:03.297 に答える
2

PostgreSQL を使用しているため、 hstoreを使用できます。

F.16。hストア

このモジュールは、単一の PostgreSQL 値内にキーと値のペアのセットを格納するための hstore データ型を実装します。これは、めったに検査されない多くの属性を持つ行や半構造化データなど、さまざまなシナリオで役立ちます。キーと値は単なるテキスト文字列です。

PostgreSQL のアップグレードが必要になる場合があります。

ただし、このような単純なスキーマの場合、3 つ (または 4 つ) の列のテーブルと、おそらく外部キーも同じように機能します。

于 2012-08-26T20:00:29.687 に答える
2

オブジェクトを文字列にシリアライズして保存できます。 Oracle SDN から

于 2012-08-26T14:03:02.937 に答える