【问题标题】:Delete all records except one in database删除数据库中除一条以外的所有记录
【发布时间】:2019-05-22 03:50:43
【问题描述】:

我必须删除所有匹配 ID 的记录,除了一个。没有我可以考虑的 dat 列。数据结构如下:

OBJECT_ID - primary key
DOC_ID
FIRST NAME
LAST NAME

我正在尝试删除与特定数字匹配的所有doc_ID,但通过 jpa 的数字除外。找不到任何 jpa 特定功能。我正在实施 JPARepository。有删除所有,有什么办法可以做到这一点?

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    public User save(User user);

    public void deleteAllByDocID(String docID);
}

更新:抱歉不确定数据库:我们正在使用 DB2,我试图写下这些查询:

  DELETE FROM USR WHERE OBJ_ID NOT IN (SELECT OBJ_ID FROM USR WHERE DOC_OBJ_ID='91298' FETCH FIRST 1 ROWS ONLY); - this gives me error transaction log is full.

还有这个:

  DELETE FROM USR WHERE OBJ_ID NOT IN (SELECT TOP(1) OBJ_ID FROM USR WHERE DOC_OBJ_ID='91298'); - and this give me error TOP is not a function

【问题讨论】:

  • 用户获取所有对象,遍历它们,删除所有对象,直到计数为length-2或size-2,完成了吗?
  • @maio290 为什么是-2?
  • @Antoniossss - 哎呀,这是一些想法,如果你使用
  • 我试图不遍历记录。
  • @ILRNew,如果您可以在 SQL 中执行此操作,则可以将该 SQL 用作本机查询。

标签: sql spring-boot spring-data-jpa db2 spring-data


【解决方案1】:

如果您不想使用自定义查询,可以这样做:

在你的仓库中定义这两个方法

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

   User findFirstByDocIDOrderByObjectIDAsc(String docID);
   void deleteAllByDocIDAndObjectIDNot(String docID, Long objectID);
}

然后在您的服务层执行此操作

User user = repository.findFirstByDocIDOrderByObjectIDAsc(docID);
if(user !=null) deleteAllByDocIDAndObjectIDNot(docID, user.objectID);

请注意,由于此解决方案使用派生删除查询,它会一一删除记录。

【讨论】:

  • 谢谢 Reza.. 我认为这将是完美的.. 但我的 hbm xml 文件是这样的:
  • 因此它抱怨我 - 没有找到类型用户的属性 docObjectID。我也不能修改我的 USER 类,因为它是作为外部 jar 的一部分添加的..
  • 我的答案基于您提供的示例Repository 代码。您需要将ObjectID 替换为User 对象的标识符属性,并将DocID 替换为Document,这是基于您的映射的属性名称。如果您可以提供 User 对象的完整映射,我可以根据此更新我的答案。
  • 很高兴能够提供帮助。如果您接受解决方案作为答案,将不胜感激。
【解决方案2】:

你可以先COUNT匹配记录,然后用LIMIT N-1删除

【讨论】:

  • 但那将是 sql 对吗?不是 jpa 特定的查询?
  • 你可以在 JPA 中完成。仅供参考,您正在使用的(spring 存储库)不是 JPA,因为我感觉到您认为它是。
  • 所以现在的问题是我可以使用 spring 存储库吗?
  • 只需使用@Query 注解;)
猜你喜欢
  • 2020-08-22
  • 2011-08-18
  • 2019-09-05
  • 2017-05-19
  • 1970-01-01
  • 2019-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-16
相关资源
最近更新 更多