Чи має Spring Data JPA який-небудь спосіб підрахунку записів за допомогою вирішення імен методу?


127

Spring Data JPA підтримує підрахунок об'єктів за допомогою специфікацій. Але чи є спосіб підрахувати об'єкти за допомогою вирішення імен методу? Скажімо, я хочу, щоб метод countByNameрахував об'єкти із конкретною назвою, як і метод findByNameдля отримання всіх об'єктів із конкретною назвою.


6
Прийміть одну з відповідей, ЯоФенг. Я протестував Spring Data JPA 1.5.2 і синтаксис countByName () працює як Абеля.
nullPainter

Відповіді:


216

Станом на дані Spring 1.7.1. ЗВ'ЯЗКУ ви можете зробити це двома різними способами,

1) Новий спосіб , використовуючи виведення запитів для запитів підрахунку та видалення. Прочитайте це (Приклад 5). Приклад,

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

2) Старий спосіб , використовуючи анотацію @Query.
Приклад,

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

або також використовуючи примітку @Param,

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

Перевірте також цю відповідь .


3
що з іншими сукупними функціями, такими як сума, середня?
lrkwz

Питання стосувалося функції підрахунку, а не суми чи середнього. Весняні дані ще не підтримують щось подібне до "нового способу" для цих функцій. Ви могли б використовувати що - щось на зразок цього
Джордж Siggouroglou

1
У вашому другому та третьому прикладах, я думаю, вам потрібно буде використовувати "SELECT COUNT (u) ...", оскільки це повинен бути запитом підрахунку.
TheChrisPratt

Дякую за Ваш коментар Це була моя помилка.
Джордж Сіггуроглу

Щоб не злитися, знайшли це - commons-lang
NickJ

19

Поки ви не використовуєте версію 1.4, ви можете використовувати явну примітку:

приклад:

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

3
зауважте, що метод повинен повертатися longзамість цього int, інакше ви отримаєте ClassCastException без жодних підказок
Рангі Лін

13

JpaRepository також розширює QueryByExampleExecutor. Тому вам навіть не потрібно визначати спеціальні методи у своєму інтерфейсі:

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

А потім запит, як:

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

Ця версія мені найбільше подобається - тим більше, що я не міг зрозуміти, як це має працювати відповідно до документа :-) Ви зберегли мій день :-) Як зауваження: Примітиви (наприклад, int) включені в пошук expamle, тобто int ageбуде включено, хоча не встановлено, але Integer ageбуде виключено із вибірки (принаймні, у Eclipselink)
LeO

Це саме те, що я шукав. Дякую!
emrekgn


8

Робочий приклад

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

Виклик із шару DAO

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

5

За словами Абеля, після версії 1.4 (протестованої у версії 1.4.3. РЕЛІЗА) можливо таким чином:

public long countByName (назва рядка);



2

Дякую всім вам! Зараз це робота. DATAJPA-231

Буде добре, якби вдалося створити підрахунок… За… методами так само, як знайти… Один. Приклад:

public interface UserRepository extends JpaRepository<User, Long> {

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


1

Я працюю з цим лише кілька тижнів, але не вірю, що це суттєво можливо, проте ви повинні мати змогу отримати той же ефект, доклавши трохи більше зусиль; просто напишіть запит самостійно та зазначайте ім'я методу. Це, мабуть, не набагато простіше, ніж написати метод самостійно, але на мою думку він чистіший.

Редагувати: тепер це можливо відповідно до DATAJPA-231


0
@Autowired
private UserRepository userRepository;

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

1
Цей приклад поза темою. Користувач запитав, як рахувати ім'я поляBy, а не як викликати основний рахунок від REST-послуги.
Яд Б.

0

Якщо хтось хоче отримати підрахунок на основі декількох умов, тут наводиться зразок спеціального запиту

@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);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.