164

Spring Data JPA支持使用规范对实体进行计数。但是它有没有办法使用方法名称解析来计算实体?假设我想要一种方法countByName来计算具有特定名称的实体,就像findByName获取具有特定名称的所有实体的方法一样。

4

12 回答 12

283

Spring Data 1.7.1.RELEASE 开始,您可以通过两种不同的方式进行操作,

  1. 方法,对计数和删除查询使用查询派生。阅读本文,(示例 5)。例子,
    public interface UserRepository extends CrudRepository<User, Integer> {
        long countByName(String name);
    }
  1. 办法,使用@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);
}

也检查this so answer

于 2014-12-13T12:07:04.193 回答
29

只要不使用 1.4 版本,都可以使用显式注解:

例子:

@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);
于 2013-05-24T07:48:23.840 回答
18

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));
于 2017-02-22T01:27:25.513 回答
13

工作示例

@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);
}
于 2017-06-23T07:04:40.283 回答
11

此功能已在 1.4 M1 版本中添加

于 2013-05-13T09:00:00.983 回答
5

显然它现在实现了DATAJPA-231

于 2013-05-16T14:39:45.160 回答
5

根据 Abel 的说法,在 1.4 版之后(在 1.4.3.RELEASE 版中测试)可以这样做:

public long countByName(String name);

于 2014-01-22T15:29:49.977 回答
4
@Autowired
private UserRepository userRepository;

@RequestMapping("/user/count")
private Long getNumberOfUsers(){
    return userRepository.count();
}
于 2018-05-07T19:26:27.263 回答
4

谢谢大家!现在它的工作。数据JPA-231

如果可以创建 count...By... 方法,就像 find...By 个一样,那就太好了。例子:

public interface UserRepository extends JpaRepository<User, Long> {

   public Long /*or BigInteger */ countByActiveTrue();
}
于 2016-11-03T05:27:51.447 回答
1

我只使用了几个星期,但我不认为这是绝对可行的,但是您应该能够通过更多的努力获得相同的效果;只需自己编写查询并注释方法名称即可。它可能并不比自己编写方法简单得多,但在我看来它更干净。

编辑:现在可以根据DATAJPA-231

于 2012-05-26T16:50:06.130 回答
1

根据问题DATAJPA-231,该功能尚未实现。

于 2012-08-11T06:06:38.977 回答
1

如果有人想根据多个条件获取计数,这里是一个示例自定义查询

@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);
于 2020-01-10T23:59:38.433 回答