代码之家  ›  专栏  ›  技术社区  ›  James

如何使用NHibernate高效地删除父实体中除最新的x个子实体以外的所有子实体?

  •  1
  • James  · 技术社区  · 16 年前

    我正在努力寻找一种有效的方法来实现这一点,问题是EntityB实例实际上相当复杂,并且本身可能有数百个子对象。EntityA上的EntityB列表是延迟加载的,如果可能的话,我希望避免将其加载到内存中。

    我尝试将HQL查询传递给Session.Delete。不幸的是,HQL似乎不支持top语句,因此我无法进行子选择来选择不删除哪些语句。

    [Edit]不幸的是,任何查询都必须是HQL而不是SQL,因为它需要独立于数据库[/Edit]

    3 回复  |  直到 16 年前
        1
  •  0
  •   yfeldblum    16 年前

    您应该能够使用HQL delete Child c where c in (:list) 哪里 list 是仅包含待删除元素的子项列表的副本。 列表 可以通过HQL查询获得,例如 from Child c where c.Parent = :parent -HQL查询显然不遵守映射的获取策略(lazy vs eanger),并且只有在指示急切地获取子对象时才会急切地获取子对象(所以不要将 left join fetch c.SubChildren )-然后过滤以仅包括要删除的元素。

        2
  •  1
  •   Spencer Ruport    16 年前

    编辑:

    我很确定您可以为此提出一个独立于数据库的SQL查询,但无论如何。。。与其尝试使用top语句,不如尝试使用MAX()(假设HQL中有这样一个函数)获取top项id,然后使用id不是MAX id的条件构造delete语句。

        3
  •  0
  •   Bela    16 年前

    Session.CreateSQLQuery([SqlStatement]).SetParameter([ParameterStuff]).ExecuteUpdate();