【问题标题】:HQL insert query with select, (unexpected token: order near line 11))带选择的 HQL 插入查询,(意外标记:第 11 行附近的订单))
【发布时间】:2013-12-07 00:56:41
【问题描述】:

我正在尝试使用 select 编写插入查询。 但我收到了这个错误 原因:org.hibernate.hql.ast.QuerySyntaxException:意外令牌:第 11 行第 23 列附近的订单

Query query = hibSession.createQuery("""
              INSERT INTO
                  ProcessOrder(
                  version,
                  numberOfPeriods,
                  billingPeriodStart,
                  billingPeriodEnd,
                  invoice,
                  billingRun,
                  org,
                  order)
              SELECT
                  1L AS version,
                  1 AS numberOfPeriods,
                  ilt.billingStartDate AS billingPeriodStart,
                  ilt.billingEndDate AS billingPeriodEnd,
                  i AS invoice,
                  i.billingRun as billingRun,
                  i.org as org,
                  soi as order
              from
                  Invoice as i
                  join i.ordersIncluded as soi
                  join i.invoiceLineItems as ilt
              where
                  i.billingRun = 36 AND
                  i.status IN ('Outstanding','Paid')  AND
                  ilt.position = 1  """)

请帮助解决这个问题

【问题讨论】:

    标签: java mysql hibernate grails hql


    【解决方案1】:

    order 是一个保留 sql 字。最好不要使用它作为别名。

    在该行上,例如使用:soi as soiOrder 当然也可以通过 soiOrder 更改插入顺序

    你也可以使用:

    .setResultTransformer(
        AliasToMapTransformer.renameAlias("soiOrder", "order").build()
    )
    

    有了这个类(版权:original answer):

    public class AliasToMapTransformer extends BasicTransformerAdapter {
    
      private Map<String, String> renameAliasMap;
    
    
      public AliasToMapTransformer(Map<String, String> renameAliasMap) {
        this.renameAliasMap = (renameAliasMap == null) ? Collections.<String, String>emptyMap() : renameAliasMap;
      }
    
    
      @Override
      public Object transformTuple(Object[] tuple, String[] aliases) {
        Map<String, Object> result = new HashMap<String, Object>(tuple.length);
        for (int i = 0; i < tuple.length; i++) {
            String alias = aliases[i];
            if (alias != null) {
                String newAlias = renameAliasMap.get(alias);
    
                result.put((newAlias != null) ? newAlias : alias, tuple[i]);
            }
        }
        return result;
      }
    
    
      public static Builder renameAlias(String alias, String newAlias) {
        return new Builder().renameAlias(alias, newAlias);
      }
    
    
      public static class Builder {
    
        private Map<String, String> aliasConversionMap = new HashMap<String, String>();
    
    
        public Builder renameAlias(String alias, String newAlias) {
            aliasConversionMap.put(alias, newAlias);
            return this;
        }
    
    
        public AliasToMapTransformer build() {
            return new AliasToMapTransformer(aliasConversionMap);
        }
      }
    }
    

    【讨论】:

    • 你的意思是 HQL,不是 SQL。
    • 但我的 DomainClass 有订单字段,所以我不能用 soiOrder 更改它。或者,如果我更改它,那么它会给出此错误无法解析属性:类 ProcessOrder 的 soiOrder
    • 这只是您查询中的别名。别名与您的域无关。相信我。通过 soiOrder 更改订单 2 次。就试一试吧。反复试验。
    • 引起:org.hibernate.QueryException:无法解析属性:soiOrder of:com.ProcessOrder [ INSERT INTO ProcessOrder(version, numberOfPeriods, billingPeriodStart, billingPeriodEnd, invoice, billingRun, org, soiOrder) 选择1L AS version, 1 AS numberOfPeriods, ilt.billingStartDate AS billingPeriodStart, ilt.billingEndDate AS billingPeriodEnd, i AS invoice, i.billingRun as billingRun, i.org as org, soi as soiOrder from com.blusynergy.blubilling.invoice.Invoice as我加入 i.ordersIncluded 作为 soi 加入 i.invoiceLineItems 作为 ilt 现在这个错误来了
    • 啊,是的,当然。那么你可以使用这个: .setResultTransformer( AliasToMapTransformer.renameAlias("soiOrder", "order").build() ) 查看我编辑的答案
    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    相关资源
    最近更新 更多