【问题标题】:Indexed Binding printing NULL in JOOQJOOQ中的索引绑定打印NULL
【发布时间】:2021-08-22 20:25:48
【问题描述】:
package com.jooq.demo;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;

import com.jooq.utils.DBUtils;

import static org.jooq.impl.DSL.*;
import org.jooq.*;
import org.jooq.impl.*;


public class Demo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Connection conn = null;
        conn=DBUtils.getConnection();
        DSLContext create = DSL.using(conn, SQLDialect.MYSQL);

        Query query = create.select(val(1),val(2),val(3),val(4),val(5),val(6),val(7),val(8),val(9),val(10),val(11),val(12))
                            .from(table("T"));
        query.bind(1,"C1");
        query.bind(2,"C2");
        List<Object> val = query.getBindValues();
        System.out.println(val.get(0));

    }

}
Output:-
null

我使用的是 JAVA 8,mysql 连接器版本为 5.1.8, JOOQ 版本 3.14.11

它在输出中打印空值。我期待绑定发生并且 在输出中打印 C1。

我的代码有什么错误?

【问题讨论】:

  • 你实际上想做什么,即这个例子代表什么实际问题?
  • 我希望 select() 中的那些字段采用存储在数组中的值。像 select(?,?,?.等) 和问号将被查询字符串中的数组值替换
  • 但是为什么不将整个选择的创建延迟到数组已知时呢?您将获得更具可读性/可维护性的结果。如果您有兴趣,可以提出一个新问题,即“在给定的情况下,我如何才能最好地创建动态查询……”,我很乐意向您展示我的意思的示例。
  • 好的,感谢您的帮助。我创建了一个新问题link
  • 我很高兴我问了。所以你的实际问题根本不是关于bind values,而是关于列引用。

标签: java sql binding null jooq


【解决方案1】:

出现这种行为的原因是val(1)val(2) 等属于SQLDataType.INTEGER 类型,而您的值"C1" 无法转换为该类型。由于历史原因,转换没有抛出异常,而是静默失败,而是在其中放置了一个 null 绑定值。

见:https://github.com/jOOQ/jOOQ/issues/3377

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-30
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多