【问题标题】:Select fetch one result returning null选择获取一个返回 null 的结果
【发布时间】:2016-05-08 01:45:19
【问题描述】:

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

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;

【问题讨论】:

  • null 表示没有找到记录 - 打开 Jooq 在 DEBUG 级别的日志记录,您将看到发送了什么查询。这应该可以帮助您了解正在发生的事情......
  • @Shrekt 你能添加一些示例数据吗?表中有什么,名字是什么?
  • @Shrekt 您是否生成了架构?我想你可以试试jooq.select().from("Employees").where(Employees.FirstName.cast(MySQLDataType.BINARY).eq(DSL.cast(firstName, MySQLDataType.BINARY))).fetchOne();
  • 为什么需要演员表?这样一个简单的查询应该看起来像Result&lt;EmoloyeeRecord&gt; result = jooq.selectFrom(Tables.EMPLOYEE).where(Tables.EMPLOYEE.FIRST_NAME.eq(firstName)).fetchOne();
  • 我可以在没有架构的情况下做到这一点吗?只是选择从数据库中获取它,就像我正在尝试做的那样?

标签: java mysql sql jooq


【解决方案1】:

这个:

// 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 手册中关于“plain SQL”和“identifiers”的部分来帮助澄清事情:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 2021-06-26
    • 1970-01-01
    • 2019-05-10
    • 2021-12-25
    相关资源
    最近更新 更多