java jOOQ可用于检查本机SQL字符串
我想将jOOQ集成到一个使用本机SQL和org.springframework.jdbc.core.JdbcTemplate
的项目中。数据库模式经常更改,开发人员必须在代码中搜索已删除的列并更新查询。Hibernate或其他ORM解决方案不是一个选项,因为查询有时非常大,开发人员得到它们,只需插入到应用程序代码中。这是非常错误的修剪。所以我想整合jOOQ,但逐渐地
如果无法执行本机SQL,jOOQ会抛出编译时错误吗
我尝试了以下方法:
// Existing code
JdbcTemplate jdbcTemplate = ...
String sql = "select ...";
// Check code
try {
DSLContext dslContext = DSL.using(jdbcTemplate.getDataSource().getConnection());
Query query = dslContext.parser().parseQuery(sql + " order by NON_EXISTING_COLUMN");
} catch (SQLException e) {
...
}
// Existing code
return jdbcTemplate.query(sql, ...)
但是它编译得很好,尽管NON_EXISTING_COLUMN
实际上并不存在。也许我还不太了解JooQAPI。但我认为它应该能够做到这一点。生成表类,因此它可以检查从本机SQL字符串生成的查询是否可执行,而无需执行它。不是吗
# 1 楼答案
为什么不使用生成的类文件而不是键入本机SQL
dslContext.selectFrom(GENERATED_TABLE)...
PS:如果您使用JOOQ DSL(带有生成的类)来生成SQL,那么即使在生成的类(关系或某些聚合函数)上出现错误,它也不会抱怨,并且会成功编译
# 2 楼答案
较旧版本的jOOQ没有在解析器中实现元数据查找,或者只是在一定程度上实现了元数据查找,只是接受了所有有效的标识符。从jOOQ 3.14开始,将在以下方面改进实施: https://github.com/jOOQ/jOOQ/issues/9061
您需要向jOOQ提供一个^{} (默认为JDBC
DatabaseMetaData
支持的实现。您可能更喜欢使用生成的代码),然后jOOQ将尝试解析所有标识符在jooq3.14之前,您可以实现一个
VisitListener
来遍历已解析的SQL查询,并自己验证所有标识符