我可以在 java hibernate 中找到批处理的示例,以便我可以在两个表上运行删除查询。
2 回答
该文档包括有关 DML 样式操作的一章:
13.4. DML 风格的操作
正如已经讨论过的,自动和透明的对象/关系映射与对象状态的管理有关。对象状态在内存中可用。这意味着直接在数据库中操作数据(使用 SQL 数据操作语言 (DML) 语句:INSERT、UPDATE、DELETE)不会影响内存状态。但是,Hibernate 提供了用于通过 Hibernate 查询语言 (HQL) 执行的批量 SQL 样式 DML 语句执行的方法。
UPDATE 和 DELETE 语句的伪语法是:
( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?
.需要注意的几点:
- 在 from 子句中,FROM 关键字是可选的
- 在 from 子句中只能有一个实体。但是,它可以被别名。如果实体名称是别名,则任何属性引用都必须使用该别名进行限定。如果实体名称没有别名,那么限定任何属性引用都是非法的。
- 不能在批量 HQL 查询中指定隐式或显式连接。子查询可以在 where 子句中使用,其中子查询本身可能包含连接。
- where 子句也是可选的。
(...)
要执行 HQL DELETE,请使用相同的
Query.executeUpdate()
方法:Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Customer c where c.name = :oldName"; // or String hqlDelete = "delete Customer where name = :oldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
该
Query.executeUpdate()
方法返回的 int 值表示受操作影响的实体数。这可能与数据库中影响的行数相关,也可能不相关。HQL 批量操作可能会导致执行多个实际 SQL 语句(例如,对于连接子类)。返回的数字表示受语句影响的实际实体的数量。回到joined-subclass的例子,对其中一个子类的删除实际上可能不仅会删除该子类映射到的表,还会删除“根”表和潜在的joined-subclass表。继承层次结构。
我不确定您的意思是什么,以便我可以在两个表上运行删除查询。请记住,批量操作不会级联,如文档所述。
查看Hibernate Reference的相关章节。