如何将jooq表保存为变量然后引用它

时间:2014-01-07 15:49:24

标签: java mysql sql jooq

这是我的sql语句:

select count(*) from source s
join(select id as I from source where name is not null) e
on s.name = e.I

这是我在java中的内容

    Source s = SOURCE.as("s");
    TableLike<?> e = create.select(SOURCE.ID.as("I"))
            .from(SOURCE)
            .where(SOURCE.NAME.isNotNull()
            .asTable().as("e");

    create.selectCount()
    .from(s)
    .join(e)
    .on(s.NAME.equal(e.I))
    .fetchOne().value1();

我认为TableLike不是正确的类型,因为当我尝试执行e.I

时出现错误

1 个答案:

答案 0 :(得分:4)

不幸的是,(目前,从jOOQ 3.2开始)没有办法从派生表I中类型安全地取消引用e列,因为Java编译器无法知道存在一个I列。你将不得不求助于不安全的方法:

// Enforcing typesafety using coercion:
.join(e)
.on(s.NAME.equal(e.field("I").coerce(String.class))

// Circumventing typesafety using raw types
.join(e)
.on(s.NAME.equal((Field) e.field("I")))

通过重复使用I字段可以实现更多的类型安全:

Source s = SOURCE.as("s");
Field<String> I = SOURCE.ID.as("I");
TableLike<?> e = create.select()
        .from(SOURCE)
        .where(SOURCE.NAME.isNotNull())
        .asTable().as("e");

create.selectCount()
      .from(s)
      .join(e)
      .on(s.NAME.equal(e.field(I)))
      .fetchOne().value1();