首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PreparedStatement将Java Enums数组持久化到Postgres Enums数组

使用PreparedStatement将Java Enums数组持久化到Postgres Enums数组
EN

Stack Overflow用户
提问于 2010-05-27 06:25:52
回答 3查看 4K关注 0票数 3

我有一个Java Enum:

代码语言:javascript
复制
public enum Equipment { Hood, Blinkers, ToungTie, CheekPieces, Visor, EyeShield, None;}

和相应的Postgres枚举:

代码语言:javascript
复制
CREATE TYPE equipment AS ENUM ('Hood', 'Blinkers', 'ToungTie', 'CheekPieces', 'Visor', 'EyeShield', 'None');

在我的数据库中,我有一个表,其中有一列包含"equipment“项的数组:

代码语言:javascript
复制
CREATE TABLE "Entry" (
    id bigint NOT NULL DEFAULT nextval('seq'::regclass),
    "date" character(10) NOT NULL,
    equipment equipment[]
);

最后,当我运行我的应用程序时,我有一个“设备”枚举数组,我想要使用一个准备好的语句将它们持久保存到数据库中,但我始终不知道如何做到这一点。

代码语言:javascript
复制
StringBuffer sb =  new StringBuffer("insert into \"Entry\" ");
sb.append("( \"date\", \"equipment \" )");
sb.append(" values ( ?, ? )");
PreparedStatement ps = db.prepareStatement(sb.toString());

ps.setString("2010-10-10");
ps.set???????????
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-27 06:35:43

你应该读一下this

我建议你的代码看起来像这样:

代码语言:javascript
复制
    // A column named "date" is probably illegal and not very illustrative.  "date" is a keyword for most databases.
    // Building a string that never changes again and again is a waste of CPU and heap
    private static final String INSERT_SQL =  "insert into Entry(date,equipment) values(?,?)";

    PreparedStatement ps = db.prepareStatement(INSERT_SQL);

    // Use the type system properly.  Dates should be DATE type columns in a database.  Why string?    
    ps.setDate(entryDate);

    // You shouldn't want to insert an array of values; that's not normalized.
    ps.setString(equipmentEnumValue.name());
票数 3
EN

Stack Overflow用户

发布于 2010-05-27 06:41:09

我遇到了这个问题,找不到一个好的解决方案。

我最终确定的解决方案是以字符串数组的形式插入:

代码语言:javascript
复制
conn.createArrayOf("varchar", elements.toArray());

并在数据库中进行赋值转换:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION cast_meal_array(src_str character varying[]) RETURNS meal_type[] AS $$
BEGIN
RETURN src_str::text[]::meal_type[];
END;
$$ LANGUAGE plpgsql;

DROP CAST IF EXISTS (character varying[] as meal_type[]);
CREATE CAST (character varying[] AS meal_type[]) WITH FUNCTION cast_meal_array(character varying[]) AS assignment;

我对这个解决方案并不满意,但它确实有效,并且不需要任何特殊的JDBC魔法。

票数 3
EN

Stack Overflow用户

发布于 2010-05-27 06:42:06

您正试图在普通JDBC中做两件非标准的事情:枚举和数组。它们中没有一个是非常简单的--尽管两个都可以做到。但我不建议两者都使用:我更喜欢使用ad-hoc-enum(只是一些参数表中的整数),并避免在数据库中使用数组,除非在非常特殊的情况下。如果你坚持,那就一次解决一个问题。

顺便说一句,您还有另外两个问题:大小写混合的标识符(表和列名)(必须用引号引起来,以避免postgresql折叠成小写),以及使用保留的sql字(date)作为名称的列。这并不坏,但它肯定不会让你的开发人员的生活更轻松……顺便说一句:注意\"equipment \"之后的空间

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2917286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档