带有select的HQL插入查询,(意外令牌:第11行附近的订单))

时间:2013-11-22 08:02:13

标签: java mysql hibernate grails hql

我正在尝试使用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  """)

请帮助克服这个问题

1 个答案:

答案 0 :(得分:1)

订单保留 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);
    }
  }
}