【问题标题】:HQL unexpected AST node: :HQL 意外的 AST 节点::
【发布时间】:2013-09-28 16:19:39
【问题描述】:

我的代码未能注入以下存储库。根据堆栈跟踪,我的 HQL 语法似乎无效,但我不确定我做错了什么。

@Repository
 public interface JobSetRepository extends JpaRepository<JobSetEntity, Integer> {
    @Modifying
    @Transactional
    @Query("UPDATE JobSetEntity SET workstation = :workstation, workflowProcess = :workstation.workflowProcess WHERE id = :jobSet.id")
    public Boolean updateWorkstation(@Param("jobSet") JobSetEntity jobSet, @Param("workstation") Workstation workstation);

    @Modifying
    @Transactional
    @Query("UPDATE JobSetEntity SET workflowProcess = :workflowProcess, workstation = null WHERE id = :jobSet.id")
    public Boolean updateWorkflowProcess(@Param("jobSet") JobSetEntity jobSet, @Param("workflowProcess") WorkflowProcess workflowProcess);
}

堆栈跟踪:

12:57:58,692 ERROR main org.hibernate.hql.internal.ast.ErrorCounter:54 - <AST>:1:111: unexpected AST node: :
12:57:58,693 ERROR main org.hibernate.hql.internal.ast.ErrorCounter:50 - <AST>:1:111: unexpected AST node: :
<AST>:1:111: unexpected AST node: :
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4680)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExprLhs(HqlSqlBaseWalker.java:5114)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.addrExpr(HqlSqlBaseWalker.java:4575)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1260)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.newValue(HqlSqlBaseWalker.java:1211)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.assignment(HqlSqlBaseWalker.java:1033)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.setClause(HqlSqlBaseWalker.java:747)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.updateStatement(HqlSqlBaseWalker.java:367)
    at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:255)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)

更新:我也收到了这个查询的错误:

@Query("UPDATE OrderEntity SET inProduction = :order.inProduction WHERE OrderEntity.id = :order.id")
void updateInProduction(@Param("order") OrderEntity order);

我已将我的版本更新到最新版本:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.2.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>4.2.5.Final</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.3.4.RELEASE</version>
    </dependency>

更新:我也收到此错误:

@Query("SELECT oe FROM OrderEntity oe WHERE oe.id = :orderProductEntity.id")
OrderEntity findBy(@Param("orderProductEntity") OrderProductEntity orderProductEntity);

【问题讨论】:

    标签: java hql


    【解决方案1】:

    遗憾的是,您不能使用:order.inProduction(或一般情况下的:foo.bar)。 Reference.

    【讨论】:

      【解决方案2】:

      当你使用这个时:

      :workstation.workflowProcess
      

      你正在定义一个参数,所以你不能使用那个表示法,但你必须使用一个变量:

      :workstation
      :workflowProcess
      

      等等

      【讨论】:

        【解决方案3】:

        实际上错误在 NamedQuery 语法中,你不能像
        workflowProcess = :workstation.workflowProcess
        而应该像
        workflowProcess = :workflowProcess

        【讨论】:

          【解决方案4】:

          我建议您将属性 nativeQuery 设置为 true

          @Query(value = "SELECT t.id FROM team as t JOIN project AS p ON p.team_id",
           nativeQuery = true)
          
          

          【讨论】:

            【解决方案5】:

            您可以在查询中使用 SpEL!这是我的文章。这应该有效:

            @Repository
             public interface JobSetRepository extends JpaRepository<JobSetEntity, Integer> {
                @Modifying
                @Transactional
                @Query("UPDATE JobSetEntity SET workstation = :workstation, workflowProcess = :#{#workstation.workflowProcess} WHERE id = :#{#jobSet.id}")
                public Boolean updateWorkstation(@Param("jobSet") JobSetEntity jobSet, @Param("workstation") Workstation workstation);
            

            https://dev.to/tolgee_i18n/using-param-object-in-spring-data-jpa-query-poe

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-24
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-26
              • 1970-01-01
              • 1970-01-01
              • 2019-08-23
              相关资源
              最近更新 更多