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.

YaoFeng
sumber
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 .

George Siggouroglou
sumber
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);
Roma
sumber
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));
L. Holanda
sumber
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
11

Fitur ini telah ditambahkan di versi 1.4 M1

Abel Pastur
sumber
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);
}
Sagar Misal
sumber
5

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

publik countByName panjang (nama String);

Marcos Nunes
sumber
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();
}
Thanongsak Chamung
sumber
1

Menurut masalah DATAJPA-231 , fitur tersebut belum diimplementasikan.

Oleksandr Bondarenko
sumber
Sekarang diimplementasikan
Sergey Ponomarev
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

Mark Sholund
sumber
0
@Autowired
private UserRepository userRepository;

@RequestMapping("/user/count")
private Long getNumberOfUsers(){
    return userRepository.count();
}
Богдан Ляховецкий
sumber
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);
Inzimam Tariq IT
sumber