Postgres:将自定义类型从 Java 传递到 postgres 函数

2023-12-13

我有一个 postgres 函数,它将复杂的用户定义类型作为输入。

CREATE OR REPLACE FUNCTION addUser(user IN O_USER) RETURNS VOID
AS
$$
BEGIN

end;
$$ language plpgsql;

CREATE TYPE O_USER AS (
  id NUMERIC,
  name VARCHAR(50),
  addresses O_ADDRESS[]
);


CREATE TYPE O_ADDRESS AS (
  id NUMERIC,
  city VARCHAR(50)
);

现在我需要从 Java 调用该函数。 我的理解是,我需要传递一个字符串,该字符串将由 db 类型转换为 UDT。

当我传递没有地址的用户时,它工作正常。但是如果我也传递地址数组,那么它就会给我错误。

ERROR:  malformed array literal: "{(1"
DETAIL:  Unexpected end of input.
SQL state: 22P02
Character: 23

我也可以使用 postgres select 语句重现该问题。例如以下工作正常

Select * from addUser('(1, "Vishal", {})');

但是当我传递地址时,就会出现问题

Select * from addUser('(1, "Vishal", {(1,"tet")})');
Select * from addUser('(1, "Vishal", {"(1,)"})');
Select * from addUser('(1, "Vishal", {"(1,null)"})')

我相信我无法正确构造字符串。知道这里出了什么问题吗?

Update

调用函数的Java代码

import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;

import javax.sql.DataSource;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

public class AddUserProcedurePostgres extends StoredProcedure {

    public AddUserProcedurePostgres(DataSource dataSource) {
        super(dataSource, "addUser");
        setFunction(true);

        declareParameter(new SqlParameter("i_User", Types.OTHER, "O_USER"));

        compile();
    }

    public void execute() {

        Map<String, Object> input = new HashMap<>();
        input.put("i_User", "(1, Vishal, array[(1,tet)]::O_ADDRESS[])");

        execute(input);
    }

}

jdbc返回的错误是:

Caused by: org.postgresql.util.PSQLException: ERROR: malformed array literal: " array[(1"
  Detail: Array value must start with "{" or dimension information.

我找到了两种将所需值传递给函数的方法:

  1. 如果 UDT 的字符串很复杂,则很难创建它。最简单的方法是进行逆向工程。在plpgsql中创建UDT并打印它。这样你就可以得到需要从Java传递的字符串。现在在 Java 代码中编写一个逻辑来创建这样的字符串。
  2. 另一种方式是以json格式传递值,并在函数中,解析json并自行构造UDT。

我选择第二种方法,因为它易于维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Postgres:将自定义类型从 Java 传递到 postgres 函数 的相关文章

  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 如何避免 ArrayIndexOutOfBoundsException 或 IndexOutOfBoundsException? [复制]

    这个问题在这里已经有答案了 如果你的问题是我得到了java lang ArrayIndexOutOfBoundsException在我的代码中 我不明白为什么会发生这种情况 这意味着什么以及如何避免它 这应该是最全面的典范 https me
  • 如何在 Spring 属性中进行算术运算?

  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • postgreSQL 在 WAMP 上的集成

    我刚刚在 Windows 7 上安装了 postgreSQL 我正在尝试将 postgreSQL 与 WAMP 服务器集成 为此 我在 httpd conf 和 php ini 文件中进行了以下更改 1个加载模块c path to libp
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 在 Google App-Engine JAVA 中将文本转换为字符串,反之亦然

    如何从字符串转换为文本 java lang String to com google appengine api datastore Text 反之亦然 Check Javadoc http code google com appengin
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • Resteasy 可以查看 JAX-RS 方法的参数类型吗?

    我们使用 Resteasy 3 0 9 作为 JAX RS Web 服务 最近切换到 3 0 19 我们开始看到很多RESTEASY002142 Multiple resource methods match request警告 例如 我们
  • 如何使用play框架上传多个文件?

    我在用play framework 2 1 2 使用java我正在创建视图来上传多个文件 我的代码在这里 form action routes upload up enctype gt multipart form data
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • 连接到 BLE 设备

    所以我制作了这个应用程序 我可以在其中找到所有具有名称的 BLE 设备 但是我怎样才能使特定字段之一可单击并自动连接到设备 以便我可以开始从中写入 读取呢 Adapter public class ListAdapter BTLE Devi
  • 如何在Spritekit中创建风效果

    我在玩 愤怒的小鸟 到了这个阶段 风 吹 你 有点推你 有点有趣 但我真的无法弄清楚可以完成此操作的逻辑或代码 我知道你可能会使用发射器来创建像 看 一样的风 但我真的很想了解如何完成精灵的 推动 谢谢 你是对的 发射器只能用来产生风在吹的
  • 阅读:hover 伪类与 javascript

    我做了一个函数来覆盖 hover页面上的某些元素 它在正常和正常之间消失 hover 影响 因为我必须创建一个 hover我的 CSS 文件中的类 我觉得这有点不干净 我怎样才能读到 hover伪类内容 Using getComputedS
  • 使用 Cypher 2.0 将 Lucene 查询传递到 Neo4j REST API

    如果我有一个 Lucene 查询 例如 title foo bar AND body baz OR title bat有没有直接的方法可以将其传递到 Cypher 查询中 它看起来像这样用来工作START和旧的node auto index
  • 我可以像数组一样使用 stdClass 吗?

    是否可以使 stdClass 对象像通用索引数组一样工作 IE 数组 数组 0 gt 120 1 gt 382 2 gt 552 3 gt 595 4 gt 616 会被构造成像 a array array 120 array 382 et
  • 手动计算SVM的决策函数

    我正在尝试使用Python库SKLearn手动计算SVC分类器的decision function 而不是使用内置方法 我已经尝试了几种方法 但是 当我don t扩展我的数据 z是一个测试数据 已缩放 我认为其他变量本身就说明了问题 另外
  • 在新 Intent 中显示 TabHost 布局时出现问题

    我在 TabActivity 类型的新 Intent 中使用 TabHost 时遇到问题 希望您能为我指出正确的方向 有趣的是 当我尝试在原始意图中查看它时 它工作正常 setContentView R layout main 我收到 强制
  • 为什么我无法在 HTML 标签内插入注释?

    有什么原因导致我无法在 HTML 标记内插入注释吗 示例 HTML 格式 不可能 img src alt Sample Picture class img circle center block gt 而在 JavaScript 中 这可以
  • ServiceStack:存在时从目录提供静态文件吗?

    我正在将我的独立的自制 Web 服务器转换为使用 ServiceStack 来提供所有页面和资源 从这个问题我看出 使用 servicestack 提供静态文件 使用服务堆栈提供单个静态文件很容易 在我自己开发的实现中 在检查 URL 是否
  • WebRTC - 从 Chrome 但不是 Firefox 获取“格式错误的约束对象”

    我想知道我做错了什么 我从中收到 格式错误的约束对象 错误 pc createAnswer function answer fail offerToReceiveAudio true offerToReceiveVideo true 有任何
  • 处理十六进制之间的转换

    我想构建一个函数来轻松地将包含十六进制代码的字符串 例如 0ae34e 转换为包含等效 ascii 值的字符串 反之亦然 我是否必须将十六进制字符串切成两个值对 然后再次将它们组合在一起 或者是否有一种方便的方法可以做到这一点 thanks
  • C#:可空结构上的默认文字和类型推断

    从 C 7 1 开始 可以通过使用获取默认值default不指定类型 我今天尝试了一下 发现可为空结构和可为空值类型的结果有些违反直觉 TestFixture public class Test private class Person p
  • 将 10 位数字转换为十六进制字符串

    如何在 C 中将 10 位数字转换为十六进制字符串 Note 如果数字少于10位 我想添加填充 例子 数字是 1 我希望我的字符串是 0000000001 Use a 标准格式字符串 string paddedHex myNumber To
  • Eigen::Ref<> 作为成员变量

    我需要一个类有一个 Eigen Ref 变量作为静态成员 该变量将通过init静态方法 像这样的东西 class CostFunction public static Eigen Ref
  • 在 Google Analytics 中组合相似的 URL(有一些变化)

    我有很多类似的网址 我想将它们合并到 Google Analytics 分析 中 我已经成功地合并了其中的很多 然而我现在遇到了一些问题 我的 URL 看起来像这样 文章 4567 编辑文章 87478548 编辑 文章 82984786
  • 当您订阅ngrx中的商店时,如何访问以前的状态和当前状态并进行比较?

    在我的组件中 我订阅了 ngrx 存储 该存储在给定状态发生变化时触发 我想设置一个条件 如果当前状态和以前的状态不同 那么我会执行一些操作 如何获取之前的状态 this store select testPortfolio subscri
  • Android 视频方向在 mediarecorder.Start() 上发生变化

    这个问题和帖子类似here here here here and here 但我被困住了 花了几个小时试图弄清楚 我有一个摄像机预览 现在总是以正确的方向显示 但是当我点击录制 mediaRecorder start 时 视频方向会发生变化
  • 在 C++ 中防止名称空间中毒的优雅方法

    我们假设 Bob已将他的库包装到名称空间中 bob and Alice将使整个命名空间在她自己的函数中可见 使用命名空间鲍勃 代替 使用鲍勃 XYZ 对于每一个项目 This file is written by Alice include
  • 角度单元测试 - 反应形式值未更新

    我是角度单元测试的新手 测试场景 html中的表单视图值等于组件表单值 电子邮件值由共享值检索并在组件注册表单中使用 我可以使用反应式表单从组件中检索电子邮件值 但是当尝试通过本机元素访问时 它给出了空 下面是component ts ng
  • Postgres:将自定义类型从 Java 传递到 postgres 函数

    我有一个 postgres 函数 它将复杂的用户定义类型作为输入 CREATE OR REPLACE FUNCTION addUser user IN O USER RETURNS VOID AS BEGIN end language pl