Apakah Spring Data JPA memiliki cara untuk menghitung hak menggunakan penyelesaian nama metode?


127

Spring Data JPA mendukung entitas penghitungan menggunakan spesifikasi. Tetapi apakah ada cara untuk menghitung entitas menggunakan metode name resolving? Katakanlah saya ingin metode countByNameuntuk menghitung entitas dengan nama tertentu, seperti metode findByNameuntuk mengambil semua entitas dengan nama tertentu.


6
Mohon terima salah satu jawaban, YaoFeng. Saya telah menguji Spring Data JPA 1.5.2 dan sintaks countByName () berfungsi sebagai catatan Abel.
nullPainter

Jawaban:


216

Pada Spring Data 1.7.1. RILIS Anda dapat melakukannya dengan dua cara berbeda,

1) Cara baru , menggunakan derivasi kueri untuk menghitung dan menghapus kueri. Baca ini , (Contoh 5). Contoh,

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

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

Cek juga ini jadi jawabannya .


3
bagaimana dengan fungsi agregat lainnya seperti jumlah, rata-rata?
lrkwz

Pertanyaannya adalah tentang fungsi hitungan, bukan penjumlahan atau rata-rata. Data musim semi belum mendukung sesuatu seperti 'cara baru' untuk fungsi ini. Anda dapat menggunakan sesuatu seperti ini
George Siggouroglou

1
Dalam contoh kedua dan ketiga Anda, saya pikir Anda perlu menggunakan "SELECT COUNT (u) ...", karena ini seharusnya menjadi kueri hitungan.
TheChrisPratt

Terima kasih atas komentarmu. Itu adalah kesalahanku.
George Siggouroglou

Tidak perlu khawatir, menemukannya - commons-lang
NickJ

19

Selama Anda tidak menggunakan versi 1.4, Anda dapat menggunakan penjelasan eksplisit:

contoh:

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

3
dicatat bahwa metode harus kembali longbukan int, jika tidak Anda akan mendapatkan ClassCastException tanpa petunjuk
Rangi Lin

13

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

Versi ini yang paling saya sukai - terutama karena saya tidak dapat membuat petunjuk bagaimana seharusnya ini bekerja sesuai dengan dokumen :-) Anda menyelamatkan hari saya :-) Sebagai komentar: Primitif (mis. Int) disertakan dalam pencarian expamle, yaitu int ageakan disertakan meskipun tidak ditetapkan, tetapi Integer ageakan dikeluarkan dari sampel (setidaknya di Eclipselink)
LeO

Inilah yang saya cari. Terima kasih!
emrekgn


8

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

5

Menurut Abel, setelah versi 1.4 (diuji dalam versi 1.4.3.RELEASE) dimungkinkan melakukan cara ini:

publik countByName panjang (nama String);



2

Terima kasih semuanya! Sekarang berhasil. DATAJPA-231

Alangkah baiknya jika memungkinkan untuk membuat hitungan ... Dengan ... metode seperti menemukan ... Dengan satu. Contoh:

public interface UserRepository extends JpaRepository<User, Long> {

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


1

Saya baru mengerjakannya selama beberapa minggu tetapi saya tidak percaya bahwa ini benar-benar mungkin, namun Anda harus bisa mendapatkan efek yang sama dengan sedikit usaha lagi; cukup tulis kueri itu sendiri dan beri anotasi nama metode. Ini mungkin tidak jauh lebih sederhana daripada menulis metode sendiri tetapi menurut saya lebih bersih.

Edit: sekarang dimungkinkan menurut DATAJPA-231


0
@Autowired
private UserRepository userRepository;

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

1
Contoh ini di luar topik. Pengguna bertanya bagaimana cara countBy nama bidang dan bukan bagaimana memanggil hitungan dasar dari layanan REST.
Jad B.

0

Jika ada yang ingin menghitung berdasarkan beberapa kondisi daripada di sini 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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.