web-dev-qa-db-ja.com

Spring Data JPAには、メソッド名解決を使用してエンティティをカウントする方法がありますか?

Spring Data JPA は、仕様を使用したエンティティのカウントをサポートします。しかし、メソッド名解決を使用してエンティティをカウントする方法はありますか?特定の名前を持つすべてのエンティティを取得するメソッドcountByNameのように、特定の名前を持つエンティティをカウントするメソッドfindByNameが必要だとしましょう。

104
YaoFeng

Spring Data 1.7.1.RELEASE現在、2つの異なる方法でそれを行うことができます。

1)new way。カウントクエリと削除クエリの両方にクエリ派生を使用します。 this 、(例5)をお読みください。例、

public interface UserRepository extends CrudRepository<User, Integer> {
    Long countByName(String name);
}

2)old way、@ Queryアノテーションを使用。
例、

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
    Long aMethodNameOrSomething(String name);
}

または@Paramアノテーションも使用して、

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=:name")
    Long aMethodNameOrSomething(@Param("name") String name);
}

this so answer も確認してください。

170

1.4バージョンを使用しない限り、明示的な注釈を使用できます。

例:

@Query("select count(e) from Product e where e.area.code = ?1")
int countByAreaCode(String code);
16
Roman

この機能はバージョン1.4 M1で追加されました

10
Abel Pastur

JpaRepositoryはQueryByExampleExecutorも拡張します。したがって、インターフェイスでカスタムメソッドを定義する必要さえありません。

public interface UserRepository extends JpaRepository<User, Long> {
    // no need of custom method
}

そして、次のようなクエリ:

User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));
7
L. Holanda

Abelによると、バージョン1.4(バージョン1.4.3.RELEASEでテスト済み)以降は、次の方法で可能です。

public long countByName(String name);

5
Marcos Nunes

どうやら今では実装されているようです DATAJPA-231

4
chpopov

実施例

@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
    List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
    long countByTenantName(String tenantName);
}

DAO層からの呼び出し

@Override
public long countByTenantName(String tenantName) {
    return repository.countByTenantName(tenantName);
}
4
Sagar Misal

どうもありがとう!今では作業です。 DATAJPA-231

Find…By…のようにcount…By…メソッドを作成することができたのは素晴らしいことです。例:

public interface UserRepository extends JpaRepository<User, Long> {

   public Long /*or BigInteger */ countByActiveTrue();
}
1

問題によると DATAJPA-231 この機能はまだ実装されていません。

@Autowired
private UserRepository userRepository;

@RequestMapping("/user/count")
private Long getNumberOfUsers(){
    return userRepository.count();
}

私は数週間しか使っていませんが、これが厳密に可能であるとは思いませんが、もう少し努力すれば同じ効果を得ることができるはずです。クエリを自分で記述し、メソッド名に注釈を付けるだけです。おそらく自分でメソッドを書くよりもそれほど簡単ではないでしょうが、私の意見ではきれいです。

0
MarkSholund