找不到Hibernate本机sql表错误

时间:2017-07-28 08:45:53

标签: mysql sql hibernate

我正在尝试在hibernate会话中运行本机SQL删除,但我得到一个例外抱怨表别名。如果我在SQL客户端中运行sql查询,那么它可以正常工作。

String sql = 'delete c from child c join parent p on c.parent_id=p.id where p.some_id = :someId'
SQLQuery deleteQuery = sessionFactory.currentSession.createSQLQuery(sql)
deleteQuery.setParameter( 'someId', some.id.longValue() )
deleteQuery.executeUpdate()

我的单元测试中抛出异常:

[main] ERROR util.JDBCExceptionReporter  - Table "C" not found; SQL statement:

delete  c  from child  c  join parent p on c.parent_id=p.id where p.some_id = ? [42102-164]

org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219)
at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1310)
at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:396)
at org.hibernate.Query$executeUpdate.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:112)

关于为什么这不能通过hibernate工作的任何建议?

1 个答案:

答案 0 :(得分:0)

(适用EDITED)

更好地使用表名。

String sql = 'DELETE child FROM child INNER JOIN parent ON child.parent_id = parent.id WHERE parent.some_id = :someId';

添加

这是适合您的示例代码(我的):

...

public boolean eliminar( Child some_id )
{
    boolean result  = false;
    Session session = null;
    Transaction rs  = null;

    try
    {
        session = sessionFactory.openSession();
        rs = session.beginTransaction();
        rs.setTimeout(5);

        String query_string = "DELETE child FROM child INNER JOIN parent ON child.parent_id = parent.id WHERE parent.some_id = :someId";
        query_string.setParameter( 'someId', some_id );
        Query q = session.createQuery(query_string);
        q.executeUpdate();

        rs.commit();

        result = true;
    }
    catch(RuntimeException e)
    {
        try
        {
            rs.rollback();
        }
        catch(RuntimeException rbe)
        {
            System.out.println(rbe.getMessage());
        }
        System.out.println(e.getMessage());
    }
    finally
    {
        session.close();
    }
    return result;
}
...