-
Notifications
You must be signed in to change notification settings - Fork 12
函数变换
Yong Zhu edited this page Mar 5, 2018
·
3 revisions
不同的数据库对同一个功能,有时会有不同的函数名称或写法,这时,可以利用jDialcets的trans方法来抹平这种写法差异。 例如以下同一个SQL,经过trans方法转换后,将分别翻译成对应各自方言的原生SQL:
System.out.println(Dialect.MySQL55Dialect.trans("select concat('a','b','c'), current_time() from user_tb"));
System.out.println(Dialect.Oracle12cDialect.trans("select concat('a','b','c'), current_time() from user_tb"));
System.out.println(Dialect.SQLServer2008Dialect.trans("select concat('a','b','c'), current_time() from user_tb"));
输出结果为:
select concat('a', 'b', 'c'), current_time from user_tb
select 'a'||'b'||'c', current_timestamp from user_tb
select ('a'+'b'+'c'), getdate() from user_tb
各个数据库方言之间函数的区别,如果想详细了解的话,可以参见项目根目录的DatabaseDialects.xls文件,其中将函数按支持比率从高到低排列。第一列为惯常的函数名称,其它列为各个方言对这个函数的写法。
有时为了明确指定jDialect只翻译指定的函数,可以用Dialect.setGlobalSqlFunctionPrefix("xxx")开关方法来指定一个非空字符串作为需要翻译的函数前缀,所有用trans方法翻译的SQL将只翻译指定前缀字符开头的函数,例如:
Dialect.setGlobalSqlFunctionPrefix("#");//指定#号前缀
System.out.println(Dialect.Oracle12cDialect.trans("select #concat('a','b','c'), current_time() from user_tb"));
输出结果为:
select 'a'||'b'||'c', current_time() from user_tb
即translate方法只针对#concat函数进行了翻译,跳过了current_time()方法。
用Dialect.setGlobalSqlFunctionPrefix(null)可取消函数前缀指定。注意要慎用setGlobalSqlFunctionPrefix方法,因为这是一个全局静态方法,只建议在程序启动过程中调用一次,设定好值后即不再做改变。
分页和函数翻译可以用paginAndTrans方法来一次完成。例如以下语句:
System.out.println(Dialect.Oracle12cDialect.paginAndTrans(3, 10,
"select concat('a','b','c'), current_time() from user_tb"));
输出结果为:select 'a'||'b'||'c', current_timestamp from user_tb offset 20 rows fetch next 10 rows only