JOOQ échoue avec PostgreSQL Custom Type comme un tableau: ERROR: malformed record literal

j'ai le type personnalisé suivant sur Postgres:

CREATE TYPE my_custom_type AS (
 field_a VARCHAR,
 field_b NUMERIC(10,3)
 );

et le tableau suivant:

CREATE TABLE my_table
(
 COL1 VARCHAR(120) NOT NULL,
 CUSTOM_COLUMN  my_custom_type,
 CUSTOM_COLUMN_ARRAY my_custom_type[]
);

Tout fonctionne bien lorsque j'utilise mon type personnalisé avec JOOQ:

@Test
public void testWithoutArray(){
    MyTableRecord record = dsl.newRecord(MyTable.MY_TABLE);

    record.setCol1("My Col1");
    MyCustomType customType = new MyCustomType();
    customType.setFieldA("Field A Val");
    customType.setFieldB(BigDecimal.ONE);
    record.setCustomColumn(customType);

    record.store();
}

Cependant, lorsque j'essaie de définir une valeur dans le champ mappé à un type personnalisé tableau, j'ai l'erreur suivante:

@Test
public void testWithArray(){
    MyTableRecord record = dsl.newRecord(MyTable.MY_TABLE);

    record.setCol1("My Col1");
    MyCustomTypeRecord customType = new MyCustomTypeRecord();
    customType.setFieldA("Field A Val 1");
    customType.setFieldB(BigDecimal.ONE);

    MyCustomTypeRecord customType2 = new MyCustomTypeRecord();
    customType2.setFieldA("Field A Val 2");
    customType2.setFieldB(BigDecimal.TEN);

    record.setCustomColumnArray(new MyCustomTypeRecord[]{customType, customType2});
    record.store();
}

org.jooq.exception.DataAccessException: SQL [insert into "my_table" ("col1", "custom_column_array") values (?, ?::my_custom_type[]) returning "my_table"."col1"]; ERROR: malformed record literal: "my_custom_type"(Field A Val 1, 1)"
 Detail: Missing left parenthesis.
    at org.jooq.impl.Utils.translate(Utils.java:1553)
    at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:571)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:347)
    at org.jooq.impl.TableRecordImpl.storeInsert0(TableRecordImpl.java:176)
    at org.jooq.impl.TableRecordImpl.operate(TableRecordImpl.java:142)
    at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:123)
    at org.jooq.impl.TableRecordImpl.storeInsert(TableRecordImpl.java:137)
    at org.jooq.impl.UpdatableRecordImpl.store0(UpdatableRecordImpl.java:185)
    at org.jooq.impl.UpdatableRecordImpl.access"151930920"0(UpdatableRecordImpl.java:85)
    at org.jooq.impl.UpdatableRecordImpl.operate(UpdatableRecordImpl.java:135)
    at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:123)
    at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:130)
    at org.jooq.impl.UpdatableRecordImpl.store(UpdatableRecordImpl.java:123)

la requête générée par JOOQ debugg est la suivante:

DEBUG [main] org.jooq.tools.LoggerListener#debug:255 - Executing query          : insert into "my_table" ("col1", "custom_column_array") values (?, ?::my_custom_type[]) returning "my_table"."col1"
DEBUG [main] org.jooq.tools.LoggerListener#debug:255 - -> with bind values      : insert into "my_table" ("col1", "custom_column_array") values ('My Col1', array[[UDT], [UDT]]) returning "my_table"."col1"

est-ce que je manque une configuration ou est-ce un bug?

Cheers

2
demandé sur carlosgarbiatti 2015-04-01 06:25:44

1 réponses

comme indiqué dans la question pertinente ( ) https://github.com/jOOQ/jOOQ/issues/4162 ), c'est une pièce manquante de support pour ce genre de fonctionnalité PostgreSQL. La réponse donnée dans le numéro jusqu'à présent est:

malheureusement, il s'agit d'un domaine où nous devons contourner quelques limites du pilote JDBC PostgreSQL, qui n'implémente pas SQLData et D'autres API (voir aussi pgjdbc/pgjdbc#63 ).

actuellement, jOOQ lie les tableaux et UDTs comme chaînes. Il semble que cette combinaison particulière ne soit pas encore supportée. Vous pourrez probablement contourner cette limitation en implémentant votre propre liaison de type de données personnalisé:

http://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings/

1
répondu Lukas Eder 2015-04-01 13:25:16