【问题标题】:Error in Insert into select from table in hibernate在休眠中从表中插入选择时出错
【发布时间】:2016-03-06 14:07:43
【问题描述】:

我们正在将系统中的 SQL 查询转换为 HQL,以使我们的系统数据库独立。我们在将插入查询从 SQL 转换为 HQL 时遇到问题。以下是我们面临问题的查询之一。

我们已将查询转换为 HQL:

<query name="Basoseext2TO_CopyFromExtrFile">
       insert into Basoseext2TO(id.location,id.masterco,id.symbol,id.policyno,id.module,id.filename,id.thedata)
       select 
       substring(id.thedata, 1, 2),
       substring(id.thedata, 3, 2),
       substring(id.thedata, 5, 3),
       substring(id.thedata, 8, 7),
       substring(id.thedata, 15, 2),
       substring(id.thedata, 17, 10),
       substring(id.thedata, 27, 3976)
       from com.csc.pt.svc.data.to.ExtrfileTO ExtrfileTO
</query>

启动时出现以下异常

[org.hibernate.hql.internal.ast.ErrorCounter](ERROR): <AST>:2:36: unexpected AST node: .
    [org.hibernate.hql.internal.ast.ErrorCounter](ERROR): <AST>:2:36: unexpected AST node: .
    <AST>:2:36: unexpected AST node: .
           at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.insertablePropertySpec(HqlSqlBaseWalker.java:984)
           at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.intoClause(HqlSqlBaseWalker.java:849)
           at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.insertStatement(HqlSqlBaseWalker.java:497)
           at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:271)
           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)
           at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
           at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:1081)
           at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:519)
           at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1760)
           at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1798)
           at bphx.c2ab.hibernate.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:216)
           at bphx.c2ab.hibernate.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:462)
           at bphx.c2ab.hibernate.HibernateSessionFactory$1.run(HibernateSessionFactory.java:157)
           at java.lang.Thread.run(Thread.java:745)

    2.   
           org.hibernate.QueryException: could not resolve property:  of: com.csc.pt.svc.data.to.Basoseext2TO [
           insert into Basoseext2TO(id.location,id.masterco,id.symbol,id.policyno,id.module,id.filename,id.thedata)
           select 
           substring(id.thedata, 1, 2),
           substring(id.thedata, 3, 2),
           substring(id.thedata, 5, 3),
           substring(id.thedata, 8, 7),
           substring(id.thedata, 15, 2),
           substring(id.thedata, 17, 10),
           substring(id.thedata, 27, 3976)
           from com.csc.pt.svc.data.to.ExtrfileTO ExtrfileTO
    ]
           at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:83)
           at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:77) 
    at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1985)
           at org.hibernate.hql.internal.ast.tree.IntoClause.isSuperclassProperty(IntoClause.java:229)
           at org.hibernate.hql.internal.ast.tree.IntoClause.visitPropertySpecNodes(IntoClause.java:171)
           at org.hibernate.hql.internal.ast.tree.IntoClause.initializeColumns(IntoClause.java:153)
           at org.hibernate.hql.internal.ast.tree.IntoClause.initialize(IntoClause.java:65)
           at org.hibernate.hql.internal.ast.HqlSqlWalker.createIntoClause(HqlSqlWalker.java:1154)
           at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.intoClause(HqlSqlBaseWalker.java:857)
           at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.insertStatement(HqlSqlBaseWalker.java:497)
           at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:271)
           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)
           at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
           at org.hibernate.internal.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:1081)
           at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:519)
           at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1760)
           at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1798)
           at bphx.c2ab.hibernate.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:216)
           at bphx.c2ab.hibernate.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:462)
           at bphx.c2ab.hibernate.HibernateSessionFactory$1.run(HibernateSessionFactory.java:157)
           at java.lang.Thread.run(Thread.java:745)

知道如何解决或编码此类查询吗?

这不是因为插入到选择查询中不允许休眠类中的复合键吗?

【问题讨论】:

  • 我不知道HQL是否支持这种语法,但是为什么不在Java中预先选择值,存储在本地变量中并将它们插入标准插入HQL?
  • 绝对可以。但是这样一来,就会有2个查询,一个是select,一个是insert。寻找一种替代方案,可以节省这种性能开销。
  • 假设 Hibernate 支持INSERT INTO .. SELECT FROM 语法,如果不先选择,它如何知道值是什么?我觉得你的假设 INSERT INTO .. SELECT FROM 比 SELECT 更有效,然后 INSERT 在这里是错误的
  • 您确定Basoseext2TO 拼写正确吗?看看这里的错误:org.hibernate.QueryException: could not resolve property: of: com.csc.pt.svc.data.to.Basoseext2TO [.
  • @zulq 是的,它拼写正确。

标签: java hibernate


【解决方案1】:

根据hibernate文档,结构应该是: INSERT INTO EntityName properties_list select_statement hibernate 文档中的示例,您的代码应如下所示:

<query name="Basoseext2TO_CopyFromExtrFile">
       insert into Basoseext2TO(field_properties)
       select 
       substring(id.thedata, 1, 2),
       substring(id.thedata, 3, 2),
       substring(id.thedata, 5, 3),
       substring(id.thedata, 8, 7),
       substring(id.thedata, 15, 2),
       substring(id.thedata, 17, 10),
       substring(id.thedata, 27, 3976)
       from com.csc.pt.svc.data.to.ExtrfileTO ExtrfileTO
</query>

在这里查看:HQL Syntax for INSERT

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 2015-08-29
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多