无法使用Jooq

时间:2018-01-20 22:28:03

标签: java sql postgresql jooq

Java 1.8,Jooq 3.10.3,Postgres 10.1

我创建了获取表参数的Postgres函数。在JOOQ生成代码之后,我试图从Java代码调用函数,但得到了奇怪的异常。

Postgres部分:

CREATE TABLE testtab
(
  id integer NOT NULL,
  txt character varying,
  CONSTRAINT testtab_pkey PRIMARY KEY (id)
);

CREATE OR REPLACE FUNCTION public.testfunc(val testtab)
RETURNS void
LANGUAGE 'plpgsql'

AS //

begin
  insert into testtab select  * from val;
end;

//;

Java Part(由Jooq codegen生成的TesttabRecord和Testfunc):

try (Connection conn = DriverManager.getConnection(url, userName, password)) {
    DSLContext cxt = DSL.using(conn, SQLDialect.POSTGRES);
    TesttabRecord r = new TesttabRecord(1, "test");
    Testfunc f = new Testfunc();
    f.setVal(r);

    f.execute(cxt.configuration());
}

获取例外:

  

2018年1月19日上午10:17:26 org.jooq.tools.JooqLogger警告警告:不是   方言支持:键入类test.db.tables.records.TesttabRecord   方言POSTGRES不支持   org.jooq.exception.SQLDialectNotSupportedException:输入类   方言不支持test.db.tables.records.TesttabRecord   在org.jooq_3.10.3.POSTGRES.debug(未知来源)的POSTGRES   org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:855)     在   org.jooq.impl.DefaultDataType.getDataType(DefaultDataType.java:799)     at org.jooq.impl.DefaultBinding.toSQLCast(DefaultBinding.java:358)     在org.jooq.impl.DefaultBinding.sql(DefaultBinding.java:290)at   org.jooq.impl.Val.accept(Val.java:80)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.Tools.renderAndBind(Tools.java:1945)at   org.jooq.impl.SQLImpl.accept(SQLImpl.java:66)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.SQLField.accept(SQLField.java:65)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.QueryPartList.accept(QueryPartList.java:101)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.Function.toSQLArguments1(Function.java:445)at   org.jooq.impl.Function.toSQLArguments0(Function.java:427)at at   org.jooq.impl.Function.toSQLArguments(Function.java:422)at   org.jooq.impl.Function.accept(Function.java:226)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.AbstractRoutine $ RoutineField.accept(AbstractRoutine.java:1635)     在   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.Tools.renderAndBind(Tools.java:1945)at   org.jooq.impl.SQLImpl.accept(SQLImpl.java:66)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.SQLTable.accept(SQLTable.java:82)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:394)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.QueryPartList.accept(QueryPartList.java:101)at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.SelectQueryImpl.toSQLReference0(SelectQueryImpl.java:1190)     在   org.jooq.impl.SelectQueryImpl.toSQLReference0(SelectQueryImpl.java:978)     在   org.jooq.impl.SelectQueryImpl.toSQLReferenceLimitDefault(SelectQueryImpl.java:771)     在org.jooq.impl.SelectQueryImpl.accept(SelectQueryImpl.java:604)at at   org.jooq.impl.DefaultRenderContext.visit0(DefaultRenderContext.java:415)     在org.jooq.impl.AbstractContext.visit0(AbstractContext.java:423)at   org.jooq.impl.AbstractContext.visit(AbstractContext.java:184)at   org.jooq.impl.AbstractQuery.getSQL0(AbstractQuery.java:498)at   org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:306)at   org.jooq.impl.AbstractResultQuery.fetch(AbstractResultQuery.java:317)     在org.jooq.impl.SelectImpl.fetch(SelectImpl.java:2597)at   org.jooq.impl.AbstractRoutine.executeSelectFromPOSTGRES(AbstractRoutine.java:433)     在org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:335)     在org.jooq.impl.AbstractRoutine.execute(AbstractRoutine.java:317)

上面的代码出了什么问题?我会感激任何建议。

2 个答案:

答案 0 :(得分:1)

这是一个错误/缺失的功能:https://github.com/jOOQ/jOOQ/issues/7174

目前(jOOQ 3.10)没有好的解决方法,没有超载功能并通过以下任何一个:

  • 看起来像表格类型(CREATE TYPE
  • 的复合类型
  • 每个表列的单个参数

关于函数的语法:

你的职能部门也有一个小问题:

CREATE OR REPLACE FUNCTION public.testfunc(val testtab)
RETURNS void
LANGUAGE 'plpgsql'
AS //
BEGIN
  INSERT INTO testtab VALUES (val.*); -- You cannot use val in FROM
END;
//;

答案 1 :(得分:0)

应生成Routines类,其中应包括您的例行程序。在那里你会找到它需要的参数。