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

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.


person YaoFeng    schedule 22.05.2012    source sumber
comment
Mohon terima salah satu jawabannya, YaoFeng. Saya telah menguji Spring Data JPA 1.5.2 dan sintaks countByName() berfungsi sebagai catatan Abel.   -  person nullPainter    schedule 30.04.2014


Jawaban (12)


Mulai Data Musim Semi 1.7.1.RELEASE Anda dapat melakukannya dengan dua cara berbeda,

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

person George Siggouroglou    schedule 13.12.2014
comment
bagaimana dengan fungsi agregat lainnya seperti jumlah, rata-rata? - person lrkwz; 26.04.2015
comment
Pertanyaannya adalah tentang fungsi hitungan, bukan jumlah atau rata-rata. Data pegas belum mendukung 'cara baru' untuk fungsi ini. Anda bisa menggunakan sesuatu seperti ini - person George Siggouroglou; 26.04.2015
comment
Dalam contoh kedua dan ketiga, saya pikir Anda perlu menggunakan SELECT COUNT(u)..., karena ini seharusnya merupakan kueri penghitungan. - person TheChrisPratt; 13.11.2015
comment
Terima kasih atas komentarmu. Itu adalah kesalahanku. - person George Siggouroglou; 15.11.2015
comment
Tidak perlu khawatir, menemukannya - commons-lang - person NickJ; 28.02.2017
comment
Saya akan menambahkan 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);
person Roman    schedule 24.05.2013
comment
perhatikan bahwa metode ini harus mengembalikan 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));
person L. Holanda    schedule 22.02.2017
comment
Versi ini paling saya sukai - terutama karena saya tidak tahu cara kerjanya menurut dokumen :-) Anda menyelamatkan hari saya :-) Sebagai komentar: Primitif (misalnya int) disertakan dalam pencarian-expamle, yaitu int age akan disertakan meskipun tidak disetel, tetapi Integer age akan dikecualikan dari sampel (setidaknya di Eclipselink) - person LeO; 12.10.2017
comment
Inilah yang saya cari. Terima kasih! - person emrekgn; 07.06.2018

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);
}
person Sagar Misal    schedule 23.06.2017

Fitur ini telah ditambahkan di versi 1.4 M1

person Abel Pastur    schedule 13.05.2013

Tampaknya ini sudah diterapkan sekarang DATAJPA-231

person chpopov    schedule 16.05.2013

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

public long countByName (Nama string);

person Marcos Nunes    schedule 22.01.2014

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();
}
person Thanongsak Chamung    schedule 03.11.2016

Menurut terbitan DATAJPA-231, fitur tersebut belum diimplementasikan.

person Oleksandr Bondarenko    schedule 11.08.2012
comment
Sekarang sudah diterapkan - person Sergey Ponomarev; 27.02.2019

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

person Mark Sholund    schedule 26.05.2012

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);
person Inzimam Tariq IT    schedule 10.01.2020

person    schedule
comment
Contoh ini di luar topik. Pengguna bertanya bagaimana cara menghitung berdasarkan nama bidang dan bukan bagaimana memanggil hitungan dasar dari layanan REST. - person Jad B.; 16.04.2020