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 FOO
、CREATE 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 4 与 RowNumber Window 功能