首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JOOQ别名建设

JOOQ别名建设
EN

Stack Overflow用户
提问于 2017-04-28 10:48:28
回答 1查看 529关注 0票数 3

我们使用JOOQ 3.7.2,如果JOOQ包含不同的绑定参数值,那么JOOQ将为同一查询计算不同的哈希码,因此,如果使用不同的输入执行,则查询的部分具有不同的别名。

在我们的代码中,我们使用构造asTable,JOOQ构造别名,如

代码语言:javascript
运行
复制
public final Table<R> asTable() {
    return (new DerivedTable(this)).as("alias_" + Utils.hash(this));
}

哈希代码从org.jooq.impl.AbstractQueryPart中计算。

代码语言:javascript
运行
复制
@Override
public int hashCode() {
    // This is a working default implementation. It should be overridden by
    // concrete subclasses, to improve performance

    return create().renderInlined(this).hashCode();
}

对于同一个具有不同输入值的查询,renderInlined(this)是不同的。例如

代码语言:javascript
运行
复制
where rownum = 1
    order by MYFIELD asc
  ) alias_132316169
) alias_55254251

代码语言:javascript
运行
复制
where rownum = 2
    order by MYFIELD asc
  ) alias_117501160
) alias_82323306

检查行相等的值是绑定变量。

是否可以为绑定变量的查询生成相同的别名代码?因为现在JOOQ生成不同的别名,这是导致Oracle查询缓存出现问题的原因。

或者可能有另一种方法存在。

示例

让我们创建表

代码语言:javascript
运行
复制
create table JOOQ_TEST (id number, val varchar2(100))

然后运行下一个代码

代码语言:javascript
运行
复制
@Test
public void testSelect() throws Exception {
    List<Long> ids = new ArrayList<Long>();
    ids.add(1L);
    ids.add(2L);

    for (Long i : ids) {
        Table table = dsl.select(JOOQ_TEST.VAL, JOOQ_TEST.ID)
                .from(JOOQ_TEST)
                .where(JOOQ_TEST.ID.eq(i))
                .orderBy(JOOQ_TEST.ID).asTable();

        dsl.select().from(table).fetch();
    }
}

我们得到了

代码语言:javascript
运行
复制
2017-04-28 17:37:58,235 DEBUG [main] org.jooq.tools.LoggerListener Executing query          : 
select 
  alias_116981037.VAL, 
  alias_116981037.ID
from (
  select 
    JOOQ_TEST.VAL, 
    JOOQ_TEST.ID
  from JOOQ_TEST
  where JOOQ_TEST.ID = ?
  order by JOOQ_TEST.ID asc
) alias_116981037
2017-04-28 17:37:58,236 DEBUG [main] org.jooq.tools.LoggerListener -> with bind values      : 
select 
  alias_116981037.VAL, 
  alias_116981037.ID
from (
  select 
    JOOQ_TEST.VAL, 
    JOOQ_TEST.ID
  from JOOQ_TEST
  where JOOQ_TEST.ID = 1
  order by JOOQ_TEST.ID asc
) alias_116981037
2017-04-28 17:37:58,593 DEBUG [main] org.jooq.tools.StopWatch Query executed           : Total: 361.112ms
2017-04-28 17:37:58,613 DEBUG [main] org.jooq.tools.LoggerListener Fetched result           : +----+----+
2017-04-28 17:37:58,613 DEBUG [main] org.jooq.tools.LoggerListener                          : |VAL |  ID|
2017-04-28 17:37:58,613 DEBUG [main] org.jooq.tools.LoggerListener                          : +----+----+
2017-04-28 17:37:58,613 DEBUG [main] org.jooq.tools.StopWatch Finishing                : Total: 381.65ms, +20.538ms
2017-04-28 17:37:58,614 DEBUG [main] org.jooq.tools.LoggerListener Executing query          : 
select 
  alias_4853230.VAL, 
  alias_4853230.ID
from (
  select 
    JOOQ_TEST.VAL, 
    JOOQ_TEST.ID
  from JOOQ_TEST
  where JOOQ_TEST.ID = ?
  order by JOOQ_TEST.ID asc
) alias_4853230
2017-04-28 17:37:58,615 DEBUG [main] org.jooq.tools.LoggerListener -> with bind values      : 
select 
  alias_4853230.VAL, 
  alias_4853230.ID
from (
  select 
    JOOQ_TEST.VAL, 
    JOOQ_TEST.ID
  from JOOQ_TEST
  where JOOQ_TEST.ID = 2
  order by JOOQ_TEST.ID asc
) alias_4853230
2017-04-28 17:37:58,633 DEBUG [main] org.jooq.tools.StopWatch Query executed           : Total: 18.899ms
2017-04-28 17:37:58,637 DEBUG [main] org.jooq.tools.LoggerListener Fetched result           : +----+----+
2017-04-28 17:37:58,638 DEBUG [main] org.jooq.tools.LoggerListener                          : |VAL |  ID|
2017-04-28 17:37:58,638 DEBUG [main] org.jooq.tools.LoggerListener                          : +----+----+
2017-04-28 17:37:58,638 DEBUG [main] org.jooq.tools.StopWatch Finishing                : Total: 23.931ms, +5.031ms
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-29 11:30:28

这是一个bug (#6025)。无论具体绑定变量如何,生成的string (以及Query.equals()Query.hashCode()行为)都应该是稳定的。

作为解决办法,您可以指定显式表别名,而不是让jOOQ为您生成表别名:

代码语言:javascript
运行
复制
Table table = dsl.select(JOOQ_TEST.VAL, JOOQ_TEST.ID)
                 .from(JOOQ_TEST)
                 .where(JOOQ_TEST.ID.eq(i))
                 .orderBy(JOOQ_TEST.ID).asTable("t"); // table alias here
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43678390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档