web-dev-qa-db-ja.com

Spring Data JPAでIDの配列による一括削除をどのように処理しますか?

これでクラスUserができました。arrayまたはjspからhtmlのリクエストデータを取得します。

これをリストInteger[] arr=[5,6,9,10,62,52,21]

次に、2つの方法を使用して、削除アクションの一括処理を完了します。

@Transactional
@Override
public void deleteUser(Integer id) {

    oneRepository.delete(id);
}


@Transactional
@Override
public void deleteSomeUser(Integer[] ids) {

    for (Integer id : ids) {

        deleteUser(id);

    }

}

このアクションを完了するためのより効率的な方法であるかどうかを知りたいです。

あなたは私のログを見ることができます:それはそれほど良くないようです!

[94, 95, 91, 92, 93]
Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?


Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    delete 
    from
        sshh_user 
    where
        ID=?



Hibernate: 
    select
        count(practice0_.ID) as col_0_0_ 
    from
        sshh_user practice0_
15
JSO

次のようなUserRepositoryがあるとします。

public interface UserRepository extends JpaRepository<User, Integer> {}

次に、次のような変更クエリメソッドをUserRepositoryに追加できます。

/**
 * Delete all user with ids specified in {@code ids} parameter
 * 
 * @param ids List of user ids
 */
@Modifying
@Query("delete from User u where u.id in ?1")
void deleteUsersWithIds(List<Integer> ids);

最後に、次のように一括削除サービスを変更できます。

@Transactional
@Override
public void deleteSomeUser(Integer[] ids) {
    oneRepository.deleteUsersWithIds(Arrays.asList(ids));
}

これにより、次のような削除クエリが生成されます。

Hibernate: delete from users where id in (? , ? , ?)

また、1つのpublic推奨メソッドを別のメソッドから呼び出すときは、 Self Invocation の問題に注意してください。

9
Ali Dehghani

以下をユーザーリポジトリインターフェースに追加するだけです

_void deleteByIdIn(List<Integer> ids);
_

Springはメソッド名の派生を介して適切なクエリを自動的に生成します。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

編集:これについて少し詳細

CrudRepositoryJpaRespositoryのようなSpringsリポジトリインターフェイスを使用すると、作成、読み取り、更新、削除、ページング、ソートなどのデータベース操作の基本セットがもたらされます。

ユーザー名やメールアドレスの検索など、いくつかの単純なクエリを手動で追加すると、Springは文字列ベースのHQLクエリなどに注釈を付けることなく、細かいメカニズムを提供します。

Springはメソッド名を分析し、キーワードを検索します。上記のキーワードが提供されているドキュメントのリンクを読みます。

_CrudRepository<User>_のメソッドの例:

Iterable<User> findByNameLike(String search)は_select * from user where name like '<search>'_に解決されます

void deleteByIdIn(List<Integer> ids)delete from user where id in ([ids])に解決されます

15
LazyProphet

リポジトリインターフェースがCrudRepositoryを拡張する場合は、単にdeleteAll(List <User> entity)を使用できます。そのようなクエリは必要ありません。

  1. findAllById(ids)を使用してList <User>を取得します

  2. deleteAll(List <ユーザー>エンティティ)

0
rayrayj92

このタイプの削除を実行するためにHQLを使用する場合、ここで確認できます http://www.Java2s.com/Tutorial/Java/0350__Hibernate/HSQLDeleteWithParameter.htm で、クエリで使用できます。

0