我正在尝试在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工作的任何建议?
答案 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;
}
...