【问题标题】:Limit delete query with hibernate使用休眠限制删除查询
【发布时间】:2015-10-27 23:59:50
【问题描述】:

我想创建一个新功能,以编程方式从表中删除行,并限制行数。这可能是要删除的数千个元素。使用的数据库是Oracle。

主要问题是 HQL 不支持 limitrownum 之类的 deletes。我们只有setMaxResults 对应select

我想到的解决方案是:

  1. 要使用select,然后循环使用delete 删除列表中的每个元素。
  2. 使用session.createSQLQuery以便能够在查询中使用limit

第 1 点:我想避免它,因为我不喜欢将元素带入内存以在之后删除它们,因为元素可以是任意数字(例如 1000000),我在以下方面没有限制元素的数量。有什么我遗漏的,我可以帮助我解决这个问题吗?

第2点:不知道session.createSQLQuerysession.createQuery的性能有什么区别,使用session.createSQLQuery有什么不便吗?

【问题讨论】:

  • 在删除查询中设置限制的目的是什么?您的数据要么符合某些标准,要么应该被删除 - 要么不。 limit 的使用没有意义。第一点是纯恶的本质,不需要从数据库中提取数据,通过网络发送它们以删除它们。
  • 由于用户要求,我必须这样做
  • 如果目的是分段清除,那么你应该使用真正的(服务器端)SQL。

标签: java sql oracle hibernate hql


【解决方案1】:

其他选项

您可以尝试迭代/加载每个对象并将其删除。 (看起来很丑!!)

您可以编写两个单独的 HQL 查询,其中第一个查询的结果被馈送到另一个查询(实际删除)。

【讨论】:

  • 多亏了这些想法,我加了票,我没想到第二个
【解决方案2】:
  1. 您可以删除对象“session.delete(object)” 原因是为了删除一个对象,Hibernate 要求该对象处于持久状态。因此,Hibernate 首先获取对象(SELECT),然后将其删除(DELETE)。您必须拥有对象 ID 才能将其删除

  2. 您正在使用 Hibernate,因为它不依赖于您使用的数据库,因此 createQuery 是 hibernate 的一个非常强大的功能,在 createQuery 中首先 hibernate 知道数据库类型(来自 jar 或您的依赖项)然后映射您的SQL 语句到要在该数据库上运行的最佳语句,在 session.createSQLQuery 中,您正在编写本机 SQL,因此它取决于您使用的 DBMS “您失去了休眠功能”

【讨论】:

  • 我投了赞成票,但在我的问题上下文中休眠功能不清楚
猜你喜欢
  • 1970-01-01
  • 2015-10-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多