Java 如何将SQL Server中的静态方法别名为H2内存数据库中的等效方法
我正在为在生产环境中运行SQL Server的应用程序添加自动集成测试。该应用程序在SQL Server中使用GIS功能,我正在尝试在内存H2数据库中构建等效版本(我在这里使用额外的工具进行GIS计算) 我试图验证的SQL Server查询使用相对简单的GIS函数,如下面的示例所示Java 如何将SQL Server中的静态方法别名为H2内存数据库中的等效方法,java,sql-server,integration-testing,h2,Java,Sql Server,Integration Testing,H2,我正在为在生产环境中运行SQL Server的应用程序添加自动集成测试。该应用程序在SQL Server中使用GIS功能,我正在尝试在内存H2数据库中构建等效版本(我在这里使用额外的工具进行GIS计算) 我试图验证的SQL Server查询使用相对简单的GIS函数,如下面的示例所示 SELECT LOCATION_ID, FROMLOCATION.FROMLOC.STDistance(TOLOCATION.TOLOC) * 0.000621371 AS MILES FROM dbo
SELECT
LOCATION_ID,
FROMLOCATION.FROMLOC.STDistance(TOLOCATION.TOLOC) * 0.000621371 AS MILES
FROM
dbo.MYTABLE1
另一个例子:
INSERT INTO dbo.MYTABLE1 (LOCATION)
VALUES (geography::POINT(:latitude, :longitude, 4326));
在所有情况下,H2提供的函数在名称上都不同于SQL Server函数,我一直在尝试创建可以工作的别名()。我遇到的问题是H2不允许我从T-SQL创建包含:
运算符的别名。我在创建此类别名时遇到以下错误:
org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #1 of resource class path resource [sql/Aliases.sql]: create alias geography::Point for "com.example.DbFunctions.createWkt"; nested exception is org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "CREATE ALIAS GEOGRAPHY::[*]POINT FOR ""com.example.DbFunctions.createWkt"" "; expected "., DETERMINISTIC, NOBUFFER, AS, FOR"; SQL statement:
create alias geography::Point for "com.example.DbFunctions.createWkt" [
如果我将别名更改为通用的(比如apoint
,而不是geography::Point
),测试将正常工作
有没有办法解决这个问题并构建包装器函数?我目前的方法是进行文本替换,将GIS调用从SQL Server方言转换为H2方言,但我希望避免这种情况,因为这会降低我尝试编写的测试的价值。您是在谈论强制转换操作吗?您试图模拟的原始SQL查询是什么?@nicolas-f我在问题本身中添加了一些细节。很抱歉,H2GIS不支持地理。这意味着WGS84上的距离函数永远不会给出预期的结果。在H2中,
:
是强制转换操作的保留运算符。(将一种类型转换为另一种类型)