Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jOOQ可以用于检查本机SQL字符串吗_Java_Sql_Native_Jooq - Fatal编程技术网

Java jOOQ可以用于检查本机SQL字符串吗

Java jOOQ可以用于检查本机SQL字符串吗,java,sql,native,jooq,Java,Sql,Native,Jooq,我想将jOOQ集成到一个使用原生SQL和org.springframework.jdbc.core.JdbcTemplate的项目中。数据库模式经常更改,开发人员必须在代码中搜索已删除的列并更新查询。Hibernate或其他ORM解决方案不是一个选项,因为查询有时非常大,开发人员得到它们,只需插入到应用程序代码中。这是非常错误的修剪。所以我想整合jOOQ,但逐渐地 如果无法执行本机SQL,jOOQ会抛出编译时错误吗 我尝试了以下方法: // Existing code JdbcTempl

我想将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, ...)

但是它编译得很好,尽管不存在的列实际上并不存在。也许我还不太了解JooQAPI。但我认为它应该能够做到这一点。生成表类,因此它可以检查从本机SQL字符串生成的查询是否可执行,而无需执行它。不是吗?

为什么不使用生成的类文件而不是键入本机SQL

dslContext.selectFrom(生成的表格).


PS:如果您使用JOOQ DSL(带有生成的类)来生成SQL,那么即使在生成的类(关系或某些聚合函数)上出现错误,它也会工作,但在某些情况下并不完全工作,它不会对此抱怨,并且会成功编译。

为什么不使用生成的类文件而不是键入本机SQL

dslContext.selectFrom(生成的表格).


PS:如果您使用JOOQ DSL(带有生成的类)来生成SQL,这将是可行的,但在某些情况下,如果您甚至在生成的类(关系或某些聚合函数)上出错,它也不会对此抱怨,并且会成功编译。

较旧版本的JOOQ没有在解析器中实现元数据查找,或者只在有限的范围内,只接受所有有效的标识符。从jOOQ 3.14开始,将在以下方面改进实施:

您需要向jOOQ提供一个(它默认为JDBC
DatabaseMetaData
支持的实现。您可能更喜欢使用生成的代码),然后jOOQ将尝试解析所有标识符


在jOOQ 3.14之前,您可以实现一个
VisitListener
,它遍历已解析的SQL查询,并自己验证所有标识符。

较旧版本的jOOQ没有在解析器中实现元数据查找,或者只在一定程度上实现元数据查找,只接受所有有效标识符。从jOOQ 3.14开始,将在以下方面改进实施:

您需要向jOOQ提供一个(它默认为JDBC
DatabaseMetaData
支持的实现。您可能更喜欢使用生成的代码),然后jOOQ将尝试解析所有标识符


在jOOQ 3.14之前,您可以实现一个
VisitListener
,它遍历已解析的SQL查询,并自己验证所有标识符。

我已经部分解释过了。开发人员从其他人那里获取本机SQL并将其插入到应用程序代码中。应用程序代码中已经有很多本机SQL,没有足够的时间使用jOOQ重写它。因此,我认为至少作为查询验证工具使用它是第一步。也许以后可以完全切换到jOOQ.Ok。首先,希望你能找到答案。在任何情况下,您的团队都可以一步一步地转换它,为每个SQL查询编写测试用例,并通过模拟对象验证SQL查询。开发人员从其他人那里获取本机SQL并将其插入到应用程序代码中。应用程序代码中已经有很多本机SQL,没有足够的时间使用jOOQ重写它。因此,我认为至少作为查询验证工具使用它是第一步。也许以后可以完全切换到jOOQ.Ok。首先,希望你能找到答案。在任何情况下,您的团队都可以一步一步地转换它,为每个SQL查询编写测试用例,并通过模拟对象验证SQL查询。