java-选择获取一个返回null的结果

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

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,它存在,但返回null.

例:

SELECT * FROM Employees WHERE FirstName = Jack;

解决方法:

这个:

// 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)

因此,这不是指您的“名字”列,而是指“名字”字符串值.您真正想做的是:

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

哪个会产生

CAST(`FirstName` AS BINARY)

区分大小写的一般说明

如果您在DDL中的表/列名称周围使用反引号,则应该始终注意jOOQ中对象名称的区分大小写.理想情况下,您将按照我的答案中的说明使用DSL.name()方法来创建区分大小写的名称.这也适用于您的雇员表,该表不区分大小写地添加到您的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”和“标识符”的部分,以帮助阐明:

> http://www.jooq.org/doc/latest/manual/sql-building/plain-sql
> http://www.jooq.org/doc/latest/manual/sql-building/names

上一篇:打包通用代码以在Java中更好地重用代码


下一篇:java-Jooq模式区分大小写