我是一个经验丰富的快乐的jOOQ用户。
我现在正在做一个项目,需要支持多个数据库引擎(至少是PostgreSQL,MySQL,Oracle)。
我们想要一个足够低级的东西来控制我们的查询。JPAHibernate对我们来说太高了。
我知道jOOQ是和元模型一起工作的,而这个元模型是由数据库模式生成的。
有没有办法在不同的数据库引擎上重用相同的jOOQ查询定义(除了引擎的特殊差异,使用相同的模式)?
如果我们需要重新编译java类的话,可以。编译时的配置对我们来说很好。
jOOQ就是为此而设计的。你需要做这些事情。
Configuration
附带 SQLDialect
准备好了,这取决于你的JDBC连接。这是最简单的部分。这是很简单的部分。Configuration
将为您的所有 jOOQ 查询自动生成特定供应商的 SQL。这可以在运行时完成。不需要任何编译时的调整。@Support({ MYSQL, ORACLE, POSTGRES })
. 例如: DSL.toDate()
不能使用,因为它不支持MySQL,但可以使用 DSL.trunc()
可以使用,因为这三种目标方言都存在。我们也越来越多地在jOOQ手册中加入特定方言的信息,例如对于 的 SHL()
功能:
-- ASE, HSQLDB, SQLDATAWAREHOUSE, SQLSERVER, SYBASE
(1 * CAST(power(2, 4) AS int))
-- AURORA_MYSQL, AURORA_POSTGRES, COCKROACHDB, CUBRID, MARIADB, MEMSQL, MYSQL, POSTGRES, SQLITE, VERTICA
(1 << 4)
-- DB2, INFORMIX
(1 * CAST(power(2, 4) AS integer))
-- FIREBIRD
bin_shl(1, 4)
-- H2
lshift(1, 4)
-- ORACLE
(1 * CAST(power(2, 4) AS number(10)))
-- TERADATA
shiftleft(1, 4)
-- ACCESS, DERBY, HANA, INGRES, REDSHIFT
/* UNSUPPORTED */
为了确保你不会不小心写出一个不能在某些方言上运行的查询,你可以。