用JPA和H2在弹簧引导中使用功能测试本机查询
#测试 #java #springboot #h2

Spring Boot为您提供使用H2测试存储库的设施,H2是一个可以模拟其他数据库方言的嵌入式内存中数据库。这是一个方便的功能,但有局限性。这些局限性之一是H2没有模仿其他数据库中现有功能的全部范围。
然后,说您发现自己想使用JPA本机查询功能在Microsoft SQL Server上执行查询Bellow,并将投影映射到POJO:

-- MS SQL Server has a FORMAT function for dates, H2 doesn't
SELECT 
  FORMAT(tbl.TIMESTAMP, 'yyyy-MM-dd') as date, 
  count(*) as count,
  tbl.COUNTRY as value
FROM
  ORDERS tbl
GROUP BY
  FORMAT(tbl.TIMESTAMP, 'yyyy-MM-dd'), tbl.COUNTRY;

这将在SQL Server上运行良好,但是在H2上会失败,因为那里的功能格式不存在。通常的解决方案是将您的测试指向实际SQL Server实例,如果您在CI服务器上运行它,或者是否要将外部依赖关系保持在最低限度,或者您只需跳过测试,不是最好的解决方案。
但是有第三个选项,H2可以使用Java代码来定义自己的功能。 Spring Boot将在运行测试之前愉快地执行您在src/test/resources/data.sql文件中放置的任何脚本。
脚本Bellows显示了格式函数的非常简单的实现,该函数的模拟本机SQL Server版本足以运行我的单元测试。

-- src/test/resources/data.sql
create alias FORMAT as $$
import java.util.Date;
import java.text.SimpleDateFormat;
@CODE
String format(Date date, String format) {
    return new SimpleDateFormat(format).format(date);
}
$$;

希望这可以节省其他人几个小时的互联网搜索,并在春季启动和H2文档中摸索。