jooq可以用来检查本机sql字符串吗

y0u0uwnf  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(351)

我想将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字符串生成的查询是否可执行,而不必执行它。不是吗?

vybvopom

vybvopom1#

为什么不使用生成的类文件而不是键入本机sql? dslContext.selectFrom(GENERATED_TABLE)... ps:如果您使用jooqdsl(与生成的类一起)来生成sql,它将是有效的,但在某些情况下,如果您甚至在生成的类(关系或一些聚合函数)上犯了错误,它将不会抱怨它,并将成功编译。

d7v8vwbk

d7v8vwbk2#

较旧版本的jooq没有在解析器中实现元数据查找,或者只是在一定程度上实现了元数据查找,只是接受了所有有效的标识符。从jooq 3.14开始,将改进以下实现:https://github.com/jooq/jooq/issues/9061
你需要向jooq提供 Configuration.metaProvider() (它默认为jdbc DatabaseMetaData 支持实施。您可能更喜欢使用生成的代码),然后jooq将尝试解析所有标识符。
在jooq3.14之前,您可以实现 VisitListener 它遍历已解析的sql查询,并自己验证所有标识符。

相关问题