jOOQ 3.9:在具有匹配列名的连接表上“ORA-00918:列模糊定义”

时间:2017-01-18 17:15:16

标签: java sql jooq

在最新的3.9更新之后,似乎jOOQ现在使用新的Oracle 12c row_limiting_clause进行行限制,而不是旧的'rownum'语法。这会导致Oracle 12c中的“ORA-00918:列模糊定义”在具有匹配列名的连接表上。

select
    student.name,
    school.name
from student
join school on student.schoolId = school.id
offset 0 rows fetch next 25 rows only;

新条款,但根据Oracle的文档[1],

  

如果选择列表包含具有相同名称的列并且您指定了row_limiting_clause,则会发生ORA-00918错误。无论具有相同名称的列是在同一个表中还是在不同的表中,都会发生此错误。

当您尝试在使用row_limiting_clause时从两个连接表中选择所有列时,这会导致问题。

如果每个列都是单独别名,则Record.into()可能无法自动将返回的Record转换为两个表记录。

是否有通过jOOQ将别名列映射到表记录的自动方法?

[1] https://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702

3 个答案:

答案 0 :(得分:1)

两个列都具有相同的标识符setTimeout(function(){ console.log('Appending Starts'); $('#iframid').contents().find('head').append('<style></style>'); console.log('Appending Ends'); },2000); ,这是不允许的。

您可以像这样使用别名:

name

答案 1 :(得分:1)

仅供参考,这是我用于将别名列映射到类型记录的解决方案:

// following the student, school scenario from the first post

// define the prefixes
final String st_prefix = "st_";
final String sc_prefix = "sc_";

// define the tables to map to at the end
// the table names themselves aren't getting aliased in this example, but the fields are
final Table<StudentsRecord> st = STUDENTS.as(STUDENTS.getName(), field -> st_prefix + field.getName());
final Table<SchoolsRecord> sc = SCHOOL.as(SCHOOLS.getName(), field -> sc_prefix + field.getName());

// define the aliased columns
final Field<?>[] stFields = Arrays.stream(STUDENTS.fields()).map(field -> field.as(st_prefix + field.getName())).toArray(Field[]::new);
final Field<?>[] scFields = Arrays.stream(SCHOOLS.field()).map(field -> field.as(sc_prefix + field.getName())).toArray(Field[]::new);

query = context.select(stFields, scFields)
   .from(STUDENTS)
   .join(SCHOOLS).on(STUDENTS.SCHOOL_ID.equal(SCHOOLS.SCHOOL_ID)
   .offset(0)
   .limit(25);

// map the aliased columns into the tables expecting aliased columns
return query.fetchInto(record -> new Tuple2<>(record.into(st), record.into(sc)));

此解决方案依赖于jOOQ 3.9功能,即“功能别名”1.这用于创建别名列可以使用Record.into()方法映射到的表。

这是最短的解决方案 - 使用12c功能 - 我能想到的。

[1] https://github.com/jOOQ/jOOQ/issues/4512

答案 2 :(得分:0)

这是jOOQ 3.9(#5451)中的已知问题/回归,已在jOOQ 3.9.1中修复。作为一种变通方法,您可以使用SQLDialect.ORACLE11G恢复为&#34; old&#34; ROWNUMlimit()的{​​{1}}过滤模拟。