Spring Данные JPA поддерживают подсчет объектов с использованием спецификаций. Но есть ли способ подсчета объектов с использованием разрешения имени метода? Скажем, мне нужен метод countByName
для подсчета объектов с определенным именем, как метод findByName
для извлечения всех объектов с определенным именем.
Имеет ли Spring Data JPA какой-либо способ подсчета вопросов с использованием разрешения имени метода?
Ответ 1
По состоянию Spring Данные 1.7.1.RELEASE вы можете сделать это двумя разными способами,
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);
}
Ответ 2
Пока вы не используете версию 1.4, вы можете использовать явное аннотацию:
Пример:
@Query("select count(e) from Product e where e.area.code = ?1")
int countByAreaCode(String code);
Ответ 3
Эта функция была добавлена в версию 1.4 M1
Ответ 4
По словам Абеля, после версии 1.4 (протестированной в версии 1.4.3.RELEASE) можно сделать так:
public long countByName (имя строки);
Ответ 5
Рабочий пример
@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);
}
Ответ 6
По-видимому, теперь он реализован DATAJPA-231
Ответ 7
Спасибо всем! Теперь это работает. DATAJPA-231
Было бы неплохо, если бы можно было создать счет... По... методам, как найти... По одним. Пример:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
Ответ 8
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));
Ответ 9
Я работаю с ним всего несколько недель, но я не считаю, что это строго возможно, но вы должны получить тот же эффект с меньшими усилиями; просто напишите запрос самостоятельно и аннотируйте имя метода. Это, вероятно, не намного проще, чем писать метод самостоятельно, но он чище, на мой взгляд.
Ответ 10
В соответствии с вопросом DATAJPA-231 эта функция еще не реализована.