Spring Data JPA'nın yöntem adı çözümlemesini kullanarak girişleri saymanın bir yolu var mı?


127

Spring Data JPA , spesifikasyonları kullanan sayma varlıklarını destekler. Ancak, yöntem adı çözümlemesini kullanarak varlıkları saymanın herhangi bir yolu var mı? countByNameTıpkı findByNamebelirli bir ada sahip tüm varlıkları getirme yöntemi gibi, belirli bir ada sahip varlıkları saymak için bir yöntem istediğimi varsayalım .


6
Lütfen cevaplardan birini kabul edin, YaoFeng. Spring Data JPA 1.5.2'yi test ettim ve countByName () sözdizimi Abel'ın belirttiği gibi çalışıyor.
nullPainter

Yanıtlar:


216

İtibariyle Bahar Veri 1.7.1.RELEASE iki farklı yollar yapabilirsiniz,

1) Hem sayma hem de silme sorguları için sorgu türetmeyi kullanan yeni yöntem . Bunu okuyun (Örnek 5). Misal,

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

2) @ Sorgu ek açıklamasını kullanma eski yöntem .
Misal,

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
    Long aMethodNameOrSomething(String name);
}

veya @Param ek açıklamasını da kullanarak,

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=:name")
    Long aMethodNameOrSomething(@Param("name") String name);
}

Bu cevabı da kontrol edin .


3
Peki ya toplam, ortalama gibi diğer toplama işlevleri?
lrkwz

Soru, toplam veya ortalama değil, sayma işleviyle ilgiliydi. Bahar verileri henüz bu işlevler için 'yeni yöntem' gibi bir şeyi desteklemiyor. Sen gibi bir şey kullanabilirsiniz bu
George Siggouroglou

1
İkinci ve üçüncü örneklerinizde, "SELECT COUNT (u) ..." kullanmanız gerektiğini düşünüyorum, çünkü bunun bir sayım sorgusu olması gerekiyor.
TheChrisPratt

Yorumun için teşekkür ederim. Benim hatamdı.
George Siggouroglou

Wrorry değil, buldum - commons-lang
NickJ

19

1.4 sürümünü kullanmadığınız sürece, açık ek açıklama kullanabilirsiniz:

misal:

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

3
longbunun yerine yöntemin dönmesi gerektiğini unutmayın int, aksi takdirde herhangi bir ipucu olmadan ClassCastException alırsınız
Rangi Lin

13

JpaRepository ayrıca QueryByExampleExecutor'u genişletir. Böylece arayüzünüzde özel yöntemler tanımlamanıza bile gerek kalmaz:

public interface UserRepository extends JpaRepository<User, Long> {
    // no need of custom method
}

Ve sonra şöyle sorgulayın:

User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));

Bu sürümü en çok sevdiğim - özellikle de belgeye göre bunun nasıl çalışması gerektiğine dair bir ipucu veremediğim için :-) Günümü kurtardınız :-) Bir açıklama olarak: İlkeler (örneğin, int) son aramaya dahil edilmiştir, yani int ageayarlanmamasına rağmen dahil edilecek, ancak Integer ageörnekten çıkarılacak (en azından Eclipselink'te)
LeO

Bu tam olarak aradığım şeydi. Teşekkür ederim!
emrekgn


8

Çalışma örneği

@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
    List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
    long countByTenantName(String tenantName);
}

DAO katmanından arama

@Override
public long countByTenantName(String tenantName) {
    return repository.countByTenantName(tenantName);
}

5

Abel'e göre, 1.4.3 sürümünde test edildikten sonra (1.4.3.RELEASE sürümünde test edildi) şu şekilde yapmak mümkündür:

public long countByName (Dize adı);



2

Hepinize teşekkürler! Şimdi iş. DATAJPA-231

Sayım yaratmak mümkün olsaydı güzel olurdu…… tıpkı bul gibi yöntemlerle… Birlerle. Misal:

public interface UserRepository extends JpaRepository<User, Long> {

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


1

Onunla sadece birkaç haftadır çalışıyorum ama bunun kesinlikle mümkün olduğuna inanmıyorum, ancak aynı etkiyi biraz daha çabayla elde edebilmelisiniz; sadece sorguyu kendiniz yazın ve yöntem adına açıklama ekleyin. Muhtemelen yöntemi kendiniz yazmaktan çok daha kolay değil ama bence daha temiz.

Düzenleme: DATAJPA-231'e göre artık mümkün


0
@Autowired
private UserRepository userRepository;

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

1
Bu örnek konu dışı. Kullanıcı, REST hizmetinden temel sayımın nasıl çağrılacağını değil, alan adına göre nasıl sayılacağını sordu.
Jad B.

0

Sayımı birden fazla koşula göre almak isteyen varsa, örnek bir özel sorgu

@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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.