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

测试:MySQL与H2不兼容

闻人吕恭
2023-03-14

我试图用H2测试我的JPA原生@查询。我的原生查询如下:

  @Query(
      value = "SELECT * FROM accounts " +
              " WHERE 'account_name' LIKE LOWER(CONCAT('%', COALESCE(:searchTerm, ''), '%')) ",
      countQuery = "SELECT count(*) FROM accounts " +
                   " WHERE 'account_name' LIKE LOWER(CONCAT('%', COALESCE(:searchTerm, ''), '%')) ",
      nativeQuery = true
  )

在编写单元测试时,我得到以下H2错误:

原因:org.h2.jdbc.jdbcsqlexception:找不到表“accounts”;SQL语句:从'aws_account_name'喜欢LOWER(CONCAT(“%”,COALESCE(?,“”),“%”))限制的帐户中选择*?[42102-197]

我可以通过更改SQL语法将表名置于双引号中来修复H2错误:

  @Query(
      value = "SELECT * FROM \"accounts\" " +
              " WHERE 'account_name' LIKE LOWER(CONCAT('%', COALESCE(:searchTerm, ''), '%')) ",
      countQuery = "SELECT count(*) FROM \"accounts\" " +
                   " WHERE 'account_name' LIKE LOWER(CONCAT('%', COALESCE(:searchTerm, ''), '%')) ",
      nativeQuery = true
  )

然而,然后我的MySQL(实际的非测试环境)抱怨:

原因:java.SQL.SqlSyntaxerRoreXception:您的SQL语法中有错误;查看与您的MySQL server版本相对应的手册,以了解在“account_name”附近使用的正确语法,其中“account_name”在第1行类似LOWER(CONCAT('%',COALESCE('ab',''),‘

如何用MySQL和H2测试本机查询?

我之所以使用本机查询而不是JPQL,是因为我需要不区分大小写的搜索,并且允许“包含”匹配。

共有1个答案

太叔志尚
2023-03-14

默认情况下,MySQL将双引号中的令牌识别为字符串文字,而不是标识符(即表名或列名)。

如果我们修改MySQLsql_mode以包含ansi_quotes,那么双引号中包含的令牌将被视为标识符。但这将在SQL中引起一个问题,因为字符串文字用双引号括起来,而不是用SQL标准的单引号括起来。

如果H2兼容模式设置为MySQL,那么我们应该可以使用普通的MySQL反勾字符来转义标识符。例如:

 SELECT *
   FROM `accounts`
        ^        ^

而且,MySQL也不会反对这个构造:

WHERE 'aws_account_name' LIKE
      ^                ^

但在单引号中,MySQL将标记'aws_account_name'视为字符串文字,而不是对列的引用。

如果这是一个列名,我们可以在列引用周围使用MySQL的反勾字符。

为了减少混淆并使将来的读者更容易理解,我们通常喜欢限定列引用,即使在不是严格要求的情况下也是如此。例如,使用短表别名:

 SELECT t.*
   FROM `accounts` t
  WHERE t.`aws_account_name` LIKE ...
 类似资料:
  • 我一直在编写一些使用内存(H2)数据库的集成测试,但我一直被这个错误所困扰。 原因:组织。h2.jdbc。JdbcSQLException:未找到表“TESTTABLE”;SQL语句: 问题是,在生产中,Hibernate正在将表名和列名从骆驼大小写更改为下划线。(TestTable- 下面是我的测试配置类: } 我宁愿不必注释所有内容,这样测试就可以知道名称是什么。 对此有什么想法或建议吗?感谢

  • 查询: 有人有解决办法吗?

  • 由于 YodaOS 需要依赖设备,所以在做单元测试之前, 需要一块Rokid开发版。 设置您的测试环境 安装 Node.js 和 ADB 执行 npm install 新建测试文件夹 test/@yoda 创建一个简单的单元测试 在 test/@yoda 文件中,新建一个文件夹 wifi 在 wifi 文件夹中, 新建 ./demo.test.js 'use strict' var test =

  • 问题内容: 我在本地运行WAMP,但连接到远程MySQL数据库。PHP的本地版本是最新的5.3.0。 5.0.45版是远程数据库之一,可以正常工作。但是,我尝试连接的另一个远程数据库(版本5.0.22)在死亡之前引发以下错误: 警告:mysql_connect()[function.mysql-connect]:OK包比预期的要短6个字节。PID = 5880 in … 警告:mysql_conn

  • 我有一个在mySQL上运行的小型数据库应用程序。 我想使用H2进行测试。 我向build.gradle添加了必要的依赖项: runtimeOnly’com。h2数据库:h2' 然而,我注意到,在完成测试之后,我的mySQL数据库包含测试期间生成的字段,就好像spring没有使用H2一样。 有什么问题吗?

  • 下面的CodeIgniter查询给出了一个错误提示; SELECT列表的表达式#22不在GROUP BY子句中,并且包含非聚合列'HW3.1.HW_COMABETY.ID',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容