在最新的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
答案 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功能 - 我能想到的。
答案 2 :(得分:0)
这是jOOQ 3.9(#5451)中的已知问题/回归,已在jOOQ 3.9.1中修复。作为一种变通方法,您可以使用SQLDialect.ORACLE11G
恢复为&#34; old&#34; ROWNUM
和limit()
的{{1}}过滤模拟。