当前位置: 首页 > 知识库问答 >
问题:

jOOQ:如何创建选择查询与MySQL"BINary"运算符?

潘高洁
2023-03-14

如何使用jOOQ创建以下两个(等效的)MySQL语句中的任何一个?

SELECT * FROM `tbl` WHERE `col` = BINARY 'foobar   ';
SELECT * FROM `tbl` WHERE `col` = CAST('foobar   ' AS BINARY);

我想比较任意字符串,可能包括(重要的)尾随空白。不幸的是,MySQL在与=< /code>比较时默认忽略尾随空白。就我从这个问题中看到的,这样的比较只能使用MySQL中的BINary运算符。

我试着使用DSL。jOOQ中的cast()方法:

java prettyprint-override">myDb.selectFrom(TBL)
  .where(TBL.COL
     .eq(DSL.cast("foobar   ", MySQLDataType.BINARY)))
  .fetchOne();
// → compiler error: “The method eq(String) in the type Field<String> is not
//   applicable for the arguments (Field<byte[]>)”

myDb.selectFrom(TBL)
  .where(DSL.cast(TBL.COL, MySQLDataType.BINARY)
     .eq("foobar   "))
  .fetchOne();
// → compiler error: “The method eq(byte[]) in the type Field<byte[]> is not
//   applicable for the arguments”

myDb.selectFrom(TBL)
  .where(DSL.cast(TBL.COL, MySQLDataType.BINARY)
     .eq(DSL.cast("foobar   ", MySQLDataType.BINARY)))
  .fetchOne();
// → runtime error: “org.jooq.exception.DataTypeException: Cannot convert from
//   foobar    (class java.lang.String) to class [B”

我最后的办法是将我的查询更改为使用,而不是=。不过,这是一个黑客行为,因为我必须首先引用字符串中的任何通配符,而且我还将面临性能损失:-|


共有1个答案

濮献
2023-03-14

您的第三个示例应该可以工作,并且可能是一个错误,我已将其注册为第3255期:

myDb.selectFrom(TBL)
  .where(DSL.cast(TBL.COL, MySQLDataType.BINARY)
     .eq(DSL.cast("foobar   ", MySQLDataType.BINARY)))
  .fetchOne();

像往常一样,如果你在jOOQ中缺少一个功能,或者如果你遇到了一个错误,你可以使用普通的SQL,如下所示:

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

在您的案例中需要解决的一个示例:

myDb.selectFrom(TBL)
  .where(TBL.COL
     .eq(DSL.field("BINARY ?", String.class, "foobar   ")))
  .fetchOne();

或:

myDb.selectFrom(TBL)
  .where("{0} = BINARY {1}", TBL.COL, DSL.val("foobar   "))
  .fetchOne();
 类似资料:
  • 问题内容: 在MS Access中,我想在选择查询的返回结果中插入新列。新列的每一行都具有相同的值。例如,我的选择返回列A,B,而我希望C成为选择查询创建的新列: 问题答案:

  • 我如何写问题。*在jooq中而不是指定所有实体vaiables

  • 问题内容: 让我以简单的方式向您展示 此查询在phpmysql上同时运行正常,但在.php页面上查询时未检测到原始数据 我只是在建立英语至马拉雅拉姆语和马拉雅拉姆语至英语词典 该网站是http://www.chatfitness.com/ 从mysql接收到malayalam单词,在英语单词的基础上可以正常工作。 不幸的是,收到英语单词不能正常工作:( 我对两个函数使用相同的查询,这是用英文单词搜

  • 问题内容: 我有一个名为faq_questions的表,其结构如下: 我试图建立一个给定排序顺序的查询,选择具有最高排序顺序的行。 例子: 好的,假设我为已知的排序顺序(id 4)输入了5,我需要它返回ID为3的行。由于不能保证sort_order是连续的,所以我不能只选择known_sort_order + 1。 谢谢! 问题答案: 似乎太简单了,但是看起来像您所需要的:

  • 问题内容: 我有一个MySQL表,如下所示: 现在,我想有一个简单的MySQL查询,只需向其提供ID [例如说id=19],然后就应该获取其所有子ID [即结果应具有ID ‘20,21,22’]…。 孩子的等级未知;它可能会有所不同.... 我知道如何使用for循环…但是如何使用单个MySQL查询实现相同的目标? 问题答案: 对于MySQL 8+:使用递归with语法。 对于MySQL 5.x:使

  • 我有一个MySQL表,如下所示: 现在,我想有一个MySQL查询,我只需向它提供id(例如),然后我应该获得它的所有子id(即,结果应该有id'20、21、22']... 不知道孩子的等级;它可以变化.... 我知道如何使用循环来实现...但是如何使用单个MySQL查询实现相同的功能呢?