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


125

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


6
答えの1つ、YaoFengを受け入れてください。Spring Data JPA 1.5.2をテストしましたが、countByName()構文はAbelのメモとして機能します。
nullPainter 14

回答:


214

以下のよう春データ1.7.1.RELEASEあなたは二つの異なる方法でそれを行うことができ、

1)カウントクエリと削除クエリの両方にクエリ派生を使用する新しい方法これを読んでください(例5)。例、

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

2)古い方法、@ 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);
}

こちらもチェックして答えてください。


3
合計、平均などの他の集計関数はどうですか?
lrkwz

問題は、合計や平均ではなく、カウント関数についてでした。Springデータは、この関数の「新しい方法」のようなものをまだサポートしていません。あなたはこの
George Siggouroglou

1
2番目と3番目の例では、「SELECT COUNT(u)...」を使用する必要があると思います。これはカウントクエリであるためです。
TheChrisPratt 2015年

コメントありがとうございます。それは私の間違いでした。
George Siggouroglou 2015年

気にしないで、見つけました-commons-lang
NickJ '28 / 02/28

19

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

例:

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

3
メソッドはではlongなくを返す必要があることに注意してくださいint。そうしないと、手掛かりなしでClassCastExceptionが返されます
Rangi Lin

13

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));

このバージョンは、私が最も好きなものです-特に、ドキュメントに従ってこれがどのように機能するかを知ることができなかったためです:-)あなたは私の日を保存しました:-)備考として:プリミティブ(たとえば、int)は、expamle-searchに含まれています。つまりint age、設定されていなくても含まれますがInteger age、サンプルからは除外されます(少なくともEclipselinkで)
LeO

これはまさに私が探していたものです。ありがとうございました!
emrekgn


8

実施例

@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);
}

5

Abel氏によると、バージョン1.4(バージョン1.4.3.RELEASEでテスト済み)が次のようにできるようになった後:

public long countByName(String name);



2

みんなありがとう!今それは仕事です。DATAJPA-231

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

public interface UserRepository extends JpaRepository<User, Long> {

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


1

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

編集:DATAJPA-231に従って可能になりました


0
@Autowired
private UserRepository userRepository;

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

1
この例はトピック外です。ユーザーは、RESTサービスから基本的なカウントを呼び出す方法ではなく、フィールド名をcountByする方法を尋ねました。
Jad B.

0

誰かが複数の条件に基づいてカウントを取得したい場合は、ここにサンプルのカスタムクエリがあります

@Query("select count(sl) from SlUrl sl where sl.user =?1 And sl.creationDate between ?2 And ?3")
    long countUrlsBetweenDates(User user, Date date1, Date date2);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.