QueryDsl 设置架构

Posted

技术标签:

【中文标题】QueryDsl 设置架构【英文标题】:QueryDsl Set Schema 【发布时间】:2013-01-11 01:37:11 【问题描述】:

使用 Spring DataSource 和 QueryDsl SQLQueryImpl,如何指定架构或设置架构?

测试用例是:

    使用 querydsl-maven-plugin (2.9.0) 连接到 DB2 数据库以生成指定 <schemaPattern> 的 Q-Classes Spring 创建一个DataSource bean DataSource bean 由脚本填充(CREATE SCHEMA FOOCREATE TABLE FOO.BAR 等) JUnit 测试导入 DataSource 使用new SQLQueryImpl(dataSource.getConnection(), Configuration.DEFAULT)查询

错误:

org.h2.jdbc.JdbcSQLException: Table "BAR" not found; SQL Statement: ...

请注意,这个测试实现是一个 H2 数据库,但生产数据库是 DB2。到目前为止,我已经尝试在 JDBC 连接字符串中指定架构,但无济于事。

【问题讨论】:

H2 数据库的数据库 URL 是什么? 数据库 url 是 jdbc:h2:mem:testdb。我无法在连接 URL 中指定架构,因为架构尚不存在。 ResourceDatabasePopular 在数据库创建后被调用,CREATE SCHEMA 语句随后被执行。 您可以在打开数据库 URL (jdbc:h2:mem:test;INIT=CREATE SCHEMA IF NOT EXISTS...) 时使用INIT 功能创建架构。 【参考方案1】:

com.mysema.query.sql.SQLTemplates 有一个称为printSchema() 的构建器方法。使用builder() 方法初始化SQLTemplates 并在build() 之前调用printSchema()。示例:

SQLTemplates templates = OracleTemplates.builder().printSchema().build();

【讨论】:

【参考方案2】:

Schema 以 Q 类型编码。在SQL序列化中通过RelationalPath接口http://www.querydsl.com/static/querydsl/2.9.0/apidocs/com/mysema/query/sql/RelationalPath.html访问

【讨论】:

是的,架构名称 (FOO) 可以通过 getSchemaName() 访问,但生成的 SQL 不是完全限定的。预期:SELECT COL1 FROM FOO.BAR。实际:SELECT COL1 FROM BAR.【参考方案3】:

我能够使用我自己的实现扩展SQLTemplates,该实现称为受保护方法setPrintSchema(true);

【讨论】:

以上是关于QueryDsl 设置架构的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有域类的 querydsl 中构造查询

ElasticSearch:QueryDSL

QueryDSL 4 与 RowNumber Window 功能

SpringBoot12 QueryDSL02之利用QueryDSL实现多表关联查询

QueryDSL 的最新状态是啥?

如何使用 Querydsl 更新 JPA 实体?