代码之家  ›  专栏  ›  技术社区  ›  Shrekt

选择提取一个返回空值的结果

  •  4
  • Shrekt  · 技术社区  · 9 年前

    当我使用此语句时,它不会返回结果。

    Result<Record> result = (Result<Record>) jooq
        .select()
        .from("Employees")
        .where(DSL.cast("FirstName", MySQLDataType.BINARY)
           .eq(DSL.cast(firstName, MySQLDataType.BINARY)))
        .fetchOne();
    

    我只想选择一个结果。

    结构:

    --
    -- Table structure for table `Employees`
    --
    
    CREATE TABLE IF NOT EXISTS `Employees` (
    `id` int(11) NOT NULL,
      `FirstName` varchar(100) NOT NULL,
      `LastName` varchar(150) NOT NULL,
      `Age` tinyint(4) NOT NULL DEFAULT '0'
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
    

    我想选择的是Jack,它存在,但返回空值。

    例子:

    SELECT * FROM Employees WHERE FirstName = Jack;
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   Community CDub    7 年前

    这:

    // Assuming this static import
    import static org.jooq.impl.DSL.*;
    
    cast("FirstName", MySQLDataType.BINARY)
    

    将生成以下SQL

    -- With a bind variable:
    CAST(? AS BINARY)
    
    -- If you're inlining bind variables:
    CAST('FirstName' AS BINARY)
    

    所以,这不是指你的 `FirstName` 列,但指向 'FirstName' 字符串值。你真正想做的是:

    cast(field(name("FirstName")), MySQLDataType.BINARY);
    

    这将产生

    CAST(`FirstName` AS BINARY)
    

    关于区分大小写的一般说明

    如果您在DDL中的表/列名周围使用反勾号,那么您应该始终注意jOOQ中的对象名是否区分大小写。理想情况下,您将使用 DSL.name() 方法来创建区分大小写的名称。这也适用于您的 Employees 表,它不区分大小写地添加到SQL语句中:

    from("Employees")       // Generates a "plain SQL", case-insensitive table Employees
    

    我建议您改写以下内容:

    from(name("Employees")) // Generates a case-sensitive table identifier `Employees`
    

    它之所以有效是因为 MySQL doesn't know case sensitive table names on Windows by default .

    手动参考

    我建议阅读jOOQ手册中关于“纯SQL”和“标识符”的部分,以帮助澄清以下问题: