【问题标题】:JPQL Query generates Incorrect syntax near 'cross' for SybaseJPQL 查询在 Sybase 的“cross”附近生成不正确的语法
【发布时间】:2015-03-25 02:56:50
【问题描述】:

我有一个命名查询,它为对我的 Sybase 15 数据库的调用生成交叉连接。我想我需要重新格式化我的查询以使用连接,但无法弄清楚所需的语法。对象及其映射如下

工作流定义

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "workflow_type_id", nullable = false)
private WorkflowType workflowType;

工作流实例

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@JoinColumn(name = "workflow_def_id", nullable = false, updatable = false)
private WorkflowDef workflowDef;

我的命名查询是

@NamedQuery(name = "WorkflowInstance.hasStatus", query = "SELECT wi.id FROM WorkflowInstance wi WHERE wi.deal.id = :dealId AND wi.workflowDef.workflowType.systemKey = :wfTypeName AND wi.status IN (:statuses)")

这会引发错误

2015-01-26 16:27:24,237 DEBUG [http-8080-3] util.SQLStatementLogger - 
select
    workflowin0_.wf_instance_id as col_0_0_ 
from
    tbl_wf_instance workflowin0_ cross 
join
    tbl_workflow_def workflowde1_ cross 
join
    tbl_lkp_workflow_type workflowty2_ 
where
    workflowin0_.workflow_def_id=workflowde1_.workflow_def_id 
    and workflowde1_.workflow_type_id=workflowty2_.workflow_type_id 
    and workflowin0_.deal_id=? 
    and workflowty2_.name=? 
    and (
        workflowin0_.status in (
            ?
        )
    )

2015-01-26 16:27:24,238 TRACE [http-8080-3] type.NullableType - 将“60001972”绑定到参数:1 2015-01-26 16:27:24,239 TRACE [http-8080-3] type.NullableType - 将“CREDIT”绑定到参数:2 2015-01-26 16:27:24,240 调试 [http-8080-3] type.EnumType - 将“2”绑定到参数:3 2015-01-26 16:27:24,277 警告 [http-8080-3] util.JDBCExceptionReporter - SQL 错误:102,SQLState:42000 2015-01-26 16:27:24,278 错误 [http-8080-3] util.JDBCExceptionReporter - 'cross' 附近的语法不正确。

我在我的持久性单元中使用以下内容

<property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="false"/>
            <property name="databasePlatform" value="org.hibernate.dialect.SybaseASE15Dialect"/>
        </bean>
    </property>

谁能告诉我哪里出错了?

【问题讨论】:

  • 那里有生成的 SQL。您是否尝试过直接针对数据库执行它?尝试更多地了解查询到底出了什么问题。 (我没有 Sybase 15 专业知识来自动知道查询出了什么问题。)这可能会让您对需要做什么有所了解。
  • 您好 dcsohl,问题是 sybase 不接受交叉连接语法。我相信这是一个已知问题,但更大的问题是这不应该是交叉连接/完全外部连接,所以我想我有
  • ...我的映射或命名查询语法有问题

标签: java hibernate jpa-2.0 jpql named-query


【解决方案1】:

不支持CROSS JOIN 语法,但您可以删除关键字CROSS。语义不会改变。

【讨论】:

  • 嗨 Rob,当直接对数据库运行查询时,删除关键字“cross”仍然会导致错误......“关键字连接附近的语法不正确”。此外,我仍然认为 JPA 查询甚至不应该尝试生成交叉连接,而是生成内部连接
  • 对不起,应该是“关键字 where 附近的语法不正确”。
【解决方案2】:

JOININNER JOIN 相同。问题是没有ON ANSI 样式连接所需的子句。如果您确实想要笛卡尔积,那么只需为每个 JOIN 子句添加 ON 1=1

【讨论】:

    【解决方案3】:

    最终,这似乎是旧休眠库的问题,而不是实体上定义的映射。现在升级库会导致为 sybase 后端生成正确的 sql。

    【讨论】:

      【解决方案4】:

      这是因为方言,请尝试更改其他版本的方言。 例如如果您使用 Sybase,请在 hibernate.cfg.xml 中...

      解决方法是使用 SybaseASE15Dialect 代替 SybaseASEDialect

      【讨论】:

      • 这对我有帮助。我使用的是 SybaseDialect,它正在生成不受支持的交叉连接。将其更新到 SybaseASE15Dialect 有助于生成仅包含连接的查询,并且我的 JPQL 查询开始正常工作。看起来是兼容性问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 2013-12-15
      • 2017-02-26
      相关资源
      最近更新 更多