gpt4 book ai didi

java - 单表单元格中的对象

转载 作者:行者123 更新时间:2023-11-29 14:03:44 27 4
gpt4 key购买 nike

我上了一节课:

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

我想把这个类的对象放到数据库表的一个单元格中。有办法吗?怎么用?

最佳答案

作为使用hstore的替代方法,您有hstore、复合类型、Java序列化的byteaxml
amu is too short
使用composite type的XML文档
axml值,使用JSON data type中的json数据类型,它是Pg 9.2 beta
9.1-backported version
我认为hstore可能是一个更好的选择,但这是一个可行的选择,可以更好地用于某些用途。很难推荐一个比另一个,因为你还没有解释你要做什么和为什么。
下面是对上面列出的每个选项的说明。
复合型
复合类型是结构化的和强类型的,易于查询,表现力强,速度快,并且保留了类型系统的全部功能,因此您可以在其中包含各种复杂的值、数组等。然而,从应用程序代码中以文本形式查询和编写它们是一件非常痛苦的事情,因此您经常需要发送额外的查询来处理它们。
甚至不要考虑在JPA和Hibernate之类的其他ORMs中使用它们——你会认为它们会支持带有hstore类的复合类型,但你错了。
一旦复合类型投入使用,尝试添加或更改它是一个非常痛苦的经历。记住这一点。

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)

或作为单独的选择:
regress=# SELECT (t.this_person).* FROM some_table t;
name | surname | miasto
------+---------+--------
a | b | c
(1 row)

XML格式
XML数据类型实现了SQL/XML标准。它既丰富又轻便。SQL/XML为查询XML值提供了 @Embedded支持,您可以对结构化XML数据编写一些相当复杂和强大的查询。XML在大多数应用程序中都很容易使用,在Java中,可以使用 xpath和JAXB注释轻松地从本机Java对象进行封送和解封。
使用XML不需要对Java或Pg进行任何扩展。
XML值是结构化的,但类型不是,它接受任何格式良好的自由格式XML文档或片段。添加 IS DOCUMENT约束以禁止片段。实施更严格的结构是一种痛苦。AFAIK Pg目前无法根据xmldsd或数据库中的其他模式定义验证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,因此现在对数据库来说相当不透明;不能编写诸如“find me JSON objects where The'name'key begin with'a'”之类的查询。预计在9.3中会有所改善。
JSON支持不存在于核心JAVA SDK中,但可以从多个库中获得,其中许多库通过JAXB绑定扩展来支持编组/解包到POJOS。看,例如杰克逊的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功能强大,在查询数据时提供了许多好的谓词和运算符。但是,这种格式是非标准的,在应用程序代码中使用会很麻烦。如果使用JDBC, org/postgresql/util/HStoreConverter.java和PgJDBC hstore支持将有所帮助。
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中的二进制序列化
对于数据库来说,uliest选项可能是完全不透明的,但是您也可以 JAXB并将其存储为 bytea在数据库中。
每当类发生更改时,必须编写自定义的反序列化例程来处理仍在数据库中的类的旧版本。任何非java代码都不能使用该值,并且不能在数据库中查询它。
--
如果你能解释一下你想用这个来达到什么目的以及为什么会这样做,那真的很有帮助。

关于java - 单表单元格中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130723/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com