使用休眠限制删除查询
Limit delete query with hibernate
我想创建一个新功能,以编程方式从 table 中删除行,但行数有限制。这可能是要删除的数千个元素。使用的数据库是Oracle。
主要问题是 HQL 不支持 limit
或 rownum
之类的 deletes
。 select
.
我们只有 setMaxResults
我想到的解决方案是:
- 使用
select
,然后遍历列表,用 delete
删除列表中的每个元素。
- 要使用
session.createSQLQuery
才能在查询中使用limit
。
要点 1:我想避免它,因为我不喜欢必须将元素带到内存中才能删除它们,因为元素可以是任何数字(例如 1000000),我没有限制元素数量的术语。有什么我遗漏的吗?我可以帮助我解决这个问题吗?
第2点:不知道session.createSQLQuery
和[=20=的性能有什么区别,使用session.createSQLQuery
有什么不方便吗?
其他选项
您可以尝试迭代 over/load 每个对象并将其删除。 (好像很难看!!)
或
您可以编写两个单独的 HQL 查询,其中第一个查询的结果被送入另一个查询(执行实际删除)。
您可以删除对象"session.delete(object)"
原因是为了删除一个对象,Hibernate 要求该对象处于持久状态。因此,Hibernate 首先获取对象 (SELECT) 然后删除它 (DELETE)。你必须有对象 ID 才能删除它
您正在使用 Hibernate,因为它不依赖于您使用的数据库,因此 createQuery 是 hibernate 的一个非常强大的功能,在 createQuery 中,hibernate 首先知道数据库类型(来自 jar 或您的依赖项) 然后将您的 SQL 语句映射到该数据库上的 运行 的最佳语句,在 session.createSQLQuery 中您正在编写本机 SQL 因此它取决于您使用的 DBMS "you lost hibernate feature "
我想创建一个新功能,以编程方式从 table 中删除行,但行数有限制。这可能是要删除的数千个元素。使用的数据库是Oracle。
主要问题是 HQL 不支持 limit
或 rownum
之类的 deletes
。 select
.
setMaxResults
我想到的解决方案是:
- 使用
select
,然后遍历列表,用delete
删除列表中的每个元素。 - 要使用
session.createSQLQuery
才能在查询中使用limit
。
要点 1:我想避免它,因为我不喜欢必须将元素带到内存中才能删除它们,因为元素可以是任何数字(例如 1000000),我没有限制元素数量的术语。有什么我遗漏的吗?我可以帮助我解决这个问题吗?
第2点:不知道session.createSQLQuery
和[=20=的性能有什么区别,使用session.createSQLQuery
有什么不方便吗?
其他选项
您可以尝试迭代 over/load 每个对象并将其删除。 (好像很难看!!)
或
您可以编写两个单独的 HQL 查询,其中第一个查询的结果被送入另一个查询(执行实际删除)。
您可以删除对象"session.delete(object)" 原因是为了删除一个对象,Hibernate 要求该对象处于持久状态。因此,Hibernate 首先获取对象 (SELECT) 然后删除它 (DELETE)。你必须有对象 ID 才能删除它
您正在使用 Hibernate,因为它不依赖于您使用的数据库,因此 createQuery 是 hibernate 的一个非常强大的功能,在 createQuery 中,hibernate 首先知道数据库类型(来自 jar 或您的依赖项) 然后将您的 SQL 语句映射到该数据库上的 运行 的最佳语句,在 session.createSQLQuery 中您正在编写本机 SQL 因此它取决于您使用的 DBMS "you lost hibernate feature "