Spring Data JPAは、仕様を使用したエンティティのカウントをサポートしています。しかし、メソッド名解決を使用してエンティティをカウントする方法はありますか?特定の名前のエンティティをすべて取得countByName
するメソッドfindByName
と同様に、特定の名前のエンティティをカウントするメソッドが必要だとします。
Spring Data JPAは、仕様を使用したエンティティのカウントをサポートしています。しかし、メソッド名解決を使用してエンティティをカウントする方法はありますか?特定の名前のエンティティをすべて取得countByName
するメソッドfindByName
と同様に、特定の名前のエンティティをカウントするメソッドが必要だとします。
回答:
以下のよう春データ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);
}
こちらもチェックして答えてください。
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 age
、設定されていなくても含まれますがInteger age
、サンプルからは除外されます(少なくともEclipselinkで)
実施例
@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);
}
どうやら今実装されているDATAJPA-231
みんなありがとう!今それは仕事です。DATAJPA-231
find…Byのようにcount…By…のメソッドを作成できたのは素晴らしいことです。例:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
私はそれを数週間しか使用していませんが、これが厳密に可能であるとは信じていませんが、もう少し努力して同じ効果を得ることができるはずです。自分でクエリを記述し、メソッド名に注釈を付けるだけです。おそらく、自分でメソッドを記述するよりもそれほど単純ではありませんが、私の意見ではよりクリーンです。
編集:DATAJPA-231に従って可能になりました
@Autowired
private UserRepository userRepository;
@RequestMapping("/user/count")
private Long getNumberOfUsers(){
return userRepository.count();
}
誰かが複数の条件に基づいてカウントを取得したい場合は、ここにサンプルのカスタムクエリがあります
@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);