Java 带类型的JOOQ插入

Java 带类型的JOOQ插入,java,postgresql,jooq,Java,Postgresql,Jooq,我正在Spring4应用程序中使用JOOQ3.8.4和PostgreSQL9.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_count

我正在Spring4应用程序中使用JOOQ3.8.4和PostgreSQL9.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.money
shop.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中,似乎存在与类型嵌套数组的强制转换相关的问题。我为此创建了一个问题:

问题是,当作为绑定变量绑定时,自定义类型数组类型需要完全限定。如果它不是完全限定的,则PostgreSQL找不到该类型。此问题中描述了一种可能的解决方法:

您可以在用户的搜索路径上添加
shop
模式:

ALTER ROLE <your_login_role> SET search_path TO shop;
将角色集搜索路径更改为shop;

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

嗯,那看起来像个虫子。我不知道为什么演员不完全合格。问题是PostgreSQL有一个内置的
money
类型,这可能比您自己的自定义类型更受欢迎。如果您将您的类型重命名为
my_money
或类似的名称,是否有效?@LukasEder啊,可能是这样。“让我试试。”卢卡塞德说,我试过了,但没什么变化。不是因为钱@卢卡塞德,请看一下我的最新答案。我认为这是因为翻译后的查询缺少模式。您可以在jOOQ或数据源配置中执行此操作。我的意思是: