Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用jOOQ抽象模式?_Java_Sql_Jooq - Fatal编程技术网

Java 如何使用jOOQ抽象模式?

Java 如何使用jOOQ抽象模式?,java,sql,jooq,Java,Sql,Jooq,我试着跟着他走 首先,我从一个限定名称和表开始: Name myTableName = DSL.name("schema", "myTable"); Table<Record> myTable = DSL.table(myTableName); 然后我构建一个SQL字符串来创建表: context.createTable(myTable)....getSQL(); 但它无法映射模式: invalid schema name: schema in statement [create

我试着跟着他走

首先,我从一个限定名称和表开始:

Name myTableName = DSL.name("schema", "myTable");
Table<Record> myTable = DSL.table(myTableName);
然后我构建一个SQL字符串来创建表:

context.createTable(myTable)....getSQL();
但它无法映射模式:

invalid schema name: schema in statement [create table "schema"."myTable"(
    ...
我到底做错了什么

从更大的角度来看,我正在尝试编写可跨不同方言移植的SQL,但我必须为之构建的每个环境都使用不同的模式。我试图用Java抽象出一个通用模式,然后根据目标环境使用jOOQ进行映射。

这是一个已知的问题:

从JOOQ3.9.5开始,模式映射和表映射不应用于普通SQL表和自定义命名表。虽然不会有任何映射应用于普通SQL字符串,但后者在jOOQ 3.10中已修复

有两种解决办法:

您可以手动执行映射 您可以完全控制表引用构造,并可以显式映射表,如下所示:

Name myTableName=DSL.Name(schema(),“myTable”);
然后:

publicstringschema(){
如果(某物)
返回“schema”;
其他的
返回“公共”;
}
使用
CustomTable
一个鲜为人知的特性是,如果您不使用jOOQ的代码生成器,可以使用它来代替生成的表。这比普通的SQL表或命名表要费劲一些,但是如果您可以抽象表的构造,这可能是值得的,因为
CustomTable
允许轻松地进行。例如:

公共类BookRecord扩展了CustomRecord{
受保护的簿记(){
超级(BookTable.BOOK);
}
}
公共类BookTable扩展了CustomTable{
公共静态最终BookTable BOOK=新建BookTable();
公共静态最终表字段ID
=createField(“ID”,SQLDataType.SMALLINT,BOOK);
公共静态最终表字段标题
=createField(“TITLE”,SQLDataType.VARCHAR,BOOK);
受保护的书桌(){
super(“BOOK”,DSL.schema(DSL.name(“schema”));
}
@凌驾
public ClassIs您的架构名称“schema”是否正确?数据库中不存在“schema”。我只是将该名称用作占位符,以便在需要SQL字符串时用实际架构填充。
invalid schema name: schema in statement [create table "schema"."myTable"(
    ...