Spring Data JPA mendukung penghitungan entitas menggunakan spesifikasi. Tapi apakah ada cara untuk menghitung entitas menggunakan penyelesaian nama metode? Katakanlah saya ingin metode countByName
menghitung entitas dengan nama tertentu, seperti metode findByName
untuk mengambil semua entitas dengan nama tertentu.
Apakah Spring Data JPA memiliki cara untuk menghitung entitas menggunakan penyelesaian nama metode?
Jawaban (12)
Mulai Data Musim Semi 1.7.1.RELEASE Anda dapat melakukannya dengan dua cara berbeda,
- cara baru, menggunakan derivasi kueri untuk kueri penghitungan dan penghapusan. Baca ini, ( Contoh 5). Contoh,
public interface UserRepository extends CrudRepository<User, Integer> {
long countByName(String name);
}
- Cara lama, Menggunakan anotasi
@Query
.
Contoh,
public interface UserRepository extends CrudRepository<User, Integer> {
@Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
long aMethodNameOrSomething(String name);
}
atau menggunakan anotasi @Param
juga,
public interface UserRepository extends CrudRepository<User, Integer> {
@Query("SELECT COUNT(u) FROM User u WHERE u.name=:name")
long aMethodNameOrSomething(@Param("name") String name);
}
Periksa juga ini jadi jawabannya.
Long countByNameIn(List<String> names);
jika itu dapat membantu orang lain, ketika menghitung nilai yang berbeda
- person Jad B.; 16.04.2020
Selama Anda tidak menggunakan versi 1.4, Anda dapat menggunakan anotasi eksplisit:
contoh:
@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);
long
alih-alih int
, jika tidak, Anda akan mendapatkan ClassCastException tanpa petunjuk apa pun
- person Rangi Lin; 21.02.2014
JpaRepository juga memperluas QueryByExampleExecutor. Jadi, Anda bahkan tidak perlu menentukan metode khusus pada antarmuka Anda:
public interface UserRepository extends JpaRepository<User, Long> {
// no need of custom method
}
Dan kemudian kueri seperti:
User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));
int age
akan disertakan meskipun tidak disetel, tetapi Integer age
akan dikecualikan dari sampel (setidaknya di Eclipselink)
- person LeO; 12.10.2017
Contoh kerja
@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
long countByTenantName(String tenantName);
}
Memanggil dari lapisan DAO
@Override
public long countByTenantName(String tenantName) {
return repository.countByTenantName(tenantName);
}
Fitur ini telah ditambahkan di versi 1.4 M1
Menurut Abel, setelah versi 1.4 (diuji pada versi 1.4.3.RELEASE) dimungkinkan melakukan cara ini:
public long countByName (Nama string);
Terima kasih semuanya! Sekarang berhasil. DATAJPA-231
Akan lebih baik jika memungkinkan untuk membuat metode penghitungan…Oleh… seperti halnya menemukan…Oleh satuan. Contoh:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
Menurut terbitan DATAJPA-231, fitur tersebut belum diimplementasikan.
Saya baru mengerjakannya selama beberapa minggu, namun menurut saya hal ini tidak mungkin dilakukan, namun Anda akan bisa mendapatkan efek yang sama dengan sedikit usaha; cukup tulis kuerinya sendiri dan beri anotasi pada nama metodenya. Ini mungkin tidak lebih sederhana daripada menulis metodenya sendiri tetapi menurut saya lebih bersih.
Sunting: sekarang dimungkinkan menurut DATAJPA-231
Jika ada yang ingin mendapatkan penghitungan berdasarkan beberapa kondisi, berikut adalah contoh kueri khusus
@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);