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

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

测试用例是:

  1. 使用 querydsl-maven-plugin (2.9.0) 连接到 DB2 数据库以生成指定 <schemaPattern> 的 Q-Classes
  2. Spring 创建一个DataSource bean
  3. DataSource bean 由脚本填充(CREATE SCHEMA FOOCREATE TABLE FOO.BAR 等)
  4. JUnit 测试导入 DataSource
  5. 使用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 功能创建架构。

标签: java spring db2 h2 querydsl


【解决方案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);

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 2012-04-23
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多