jOOQ - 具有IN谓词的查询构建器

时间:2017-06-01 06:49:47

标签: java jooq

我正在尝试构建这样的查询:

List<Integer> ids = ...

String query = DSL.select(TABLE.SOMETHING).from(TABLE).where(TABLE.ID.in(ids)).
getSQL();

但是我无法使用值获取生成的查询,只有占位符。 我试过DSL.inline(ids),但它没有&#39;工作

我该怎么做?

我正在使用jOOQ 3.4.2。

感谢您的帮助。

更新:

似乎我可以这样做:

    Configuration configuration = new DefaultConfiguration();
    configuration.set(SQLDialect.DERBY);
    Settings settings = new Settings()
    .withStatementType(StatementType.STATIC_STATEMENT);
    configuration.set(settings);
    DSLContext create = DSL.using(configuration);

    String query = create.select(TABLE.SOMETHING).from(TABLE).where(TABLE.ID.in(ids)).getSQL();

如果有人能够确认这是正确的方式,谢谢。

1 个答案:

答案 0 :(得分:2)

你不能用jOOQ&#39; DSL.inline()内联列表,因为如果可以的话,这样一个值的语义将是数据库中列表/数组文字的语义,而不是单个值列表的语义

使用DSL.inline()的正确方法:

以下是将内联值列表传递给Field.in(Field<?>...)的正确方法:

List<Integer> ids = ...

String query = DSL.using(configuration) // Use a Configuration or at least a SQLDialect!
                  .select(TABLE.SOMETHING)
                  .from(TABLE)
                  .where(TABLE.ID.in(ids.stream().map(DSL::inline).collect(toList())))
                  .getSQL();

getSQL()为基础内联所有绑定值:

使用Query.getSQL(ParamType)

List<Integer> ids = ...

String query = DSL.using(configuration)
                  .select(TABLE.SOMETHING)
                  .from(TABLE)
                  .where(TABLE.ID.in(ids))
                  .getSQL(ParamType.INLINED);

Configuration为基础内联所有绑定值:

您在问题编辑中提到的解决方案当然也有效:

List<Integer> ids = ...
Configuration configuration = new DefaultConfiguration();
configuration.set(new Settings().withStatementType(StatementType.STATIC_STATEMENT));

String query = DSL.using(configuration)
                  .select(TABLE.SOMETHING)
                  .from(TABLE)
                  .where(TABLE.ID.in(ids))
                  .getSQL();