java - JOOQ 插入式

标签 java postgresql jooq

我在 Spring 4 应用程序中使用 jOOQ 3.8.4 和 PostgreSQL 9.5。我有下表和类型定义

 CREATE DOMAIN shop.money_amount AS numeric(6,2) DEFAULT 0 NOT NULL CHECK (value > 0::numeric);

 CREATE TYPE shop.money AS (
   m_amount shop.money_amount,
   m_currency shop.currency,
   m_country shop.site_country
 );

 CREATE TYPE shop.money_mapping AS (
   mm_moneys shop.money []
 );

 CREATE TABLE shop.article
 (
   a_id bigserial NOT NULL,
   a_price shop.money_mapping NOT NULL,
   CONSTRAINT a_pk_id PRIMARY KEY (a_id)
 );

然后我尝试使用 jOOQ 进行插入,即:

MoneyMappingRecord priceMoneyMapping = new MoneyMappingRecord();
priceMoneyMapping.setMoneys(new MoneyRecord[]{
        new MoneyRecord().setAmount(new BigDecimal("11")).setCountry(SiteCountry.US).setCurrency(Currency.USD),
        new MoneyRecord().setAmount(new BigDecimal("14")).setCountry(SiteCountry.DE).setCurrency(Currency.EUR)
});

dsl.insertInto(ARTICLE)
        .set(ARTICLE.A_PRICE, priceMoneyMapping)
        .returning(ARTICLE.A_ID).fetchOne().getId();

然后我得到:

Caused by: org.springframework.jdbc.BadSqlGrammarException: jOOQ; 
  bad SQL grammar [insert into "shop"."article" ("a_price") values
  (row(?::money[])) returning "shop"."article"."a_id"]; nested 
  exception is org.postgresql.util.PSQLException: 
  ERROR: cannot cast type record to shop.money_mapping
  Detail: Cannot cast type money[] to shop.money[] in column 1.

我做错了什么?


更新

我尝试按照 Lukas 的建议重命名 shop.money 类型(从 shop.moneyshop.localized_money),但我认为问题与模式。查看更新后的错误。

Caused by: org.springframework.jdbc.BadSqlGrammarException: 
   jOOQ; bad SQL grammar [insert into "shop"."article" ("a_price") 
   values (row(?::localized_money[])) returning "shop"."article"."a_id"]; nested exception is    
   org.postgresql.util.PSQLException: ERROR: type "localized_money[]" does not exist

也许类型中的类型有问题!

最佳答案

在 jOOQ 3.8 中似乎存在与类型嵌套数组转换相关的问题。我为此创建了一个问题:https://github.com/jOOQ/jOOQ/issues/5571

问题是您的自定义类型数组类型在绑定(bind)为绑定(bind)变量时需要完全限定。如果它不是完全限定的,则 PostgreSQL 找不到该类型。此问题中描述了一种可能的解决方法:Permanently Set Postgresql Schema Path

您可以在用户的​​搜索路径上添加 shop 架构:

ALTER ROLE <your_login_role> SET search_path TO shop;

... 这意味着 shop 模式中的元素不再需要完全限定。这也可能是一件坏事,所以要小心! :)

关于java - JOOQ 插入式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39646870/

相关文章:

sql - 通过 jooq DSL 插入 sys_guid 生成的值

java - 创建一个java循环,当用户输入出生年份时计算用户的年龄,有什么想法吗?

java - Android 以编程方式从任何电子邮件地址发送电子邮件

java - forcedType 可以接受列的完全限定名称吗?

java - Jooq 对已知数量的参数进行排序

database - 有效地计算 Postgres 中行之间关系的强度

java - 你会如何改变你的程序图标而不是默认的java图标

java - 从前缀表示法构建二叉表达式树?

sql - 在 WHERE 子句中多次使用同一列

java - 资源类型 : javax. sql.DataSource 的 JNDI 查找失败