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

标签 java mysql sql jooq

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

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)

因此,这不是指您的 `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”和“标识符”的部分,以帮助澄清问题:

关于java - 选择取一个结果返回null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35099512/

相关文章:

java - 防止 s :message tag 中长参数的默认格式设置(逗号插入)

java - gRPC-java - .proto 文件的编译

java - 创建 session 工厂时出现空指针异常

php - 在 MySQL 中编写子查询是一种好习惯吗?

PHP/HTML 表单向 MySQL 提供空白条目

java - character_result_set 在 mysql 中为空

java - 如何在 Java 查询中使用 SQL 提示

java - Java 符号的指令地址

sql - T SQL如何通过删除最后一个分隔符之后的所有部分来修改字符串

java - 使用 Spark/java 的 ST_geomfromtext 函数