Spring Data JPA支持使用规约来计算实体的数量。但是它是否有使用方法名称解析来计算实体数量的方法呢?比如说我想要一个名为countByName
的方法,用于计算特定名称的实体数量,就像一个名为findByName
的方法可以获取所有具有特定名称的实体一样。
Spring Data JPA支持使用规约来计算实体的数量。但是它是否有使用方法名称解析来计算实体数量的方法呢?比如说我想要一个名为countByName
的方法,用于计算特定名称的实体数量,就像一个名为findByName
的方法可以获取所有具有特定名称的实体一样。
从Spring Data 1.7.1.RELEASE版本开始,你可以用两种不同的方式来实现,
public interface UserRepository extends CrudRepository<User, Integer> {
long countByName(String name);
}
@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);
}
也可以查看这个SO回答。
@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);
long
而不是int
,否则您将收到一个ClassCastException异常,但没有任何线索。 - Rangi LinJpaRepository还扩展了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 age
,也将被包括在内,但 Integer age
将从示例中排除(至少在 Eclipselink 中)。 - LeO工作示例
@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);
}
此功能已添加至版本 1.4 M1。
@Autowired
private UserRepository userRepository;
@RequestMapping("/user/count")
private Long getNumberOfUsers(){
return userRepository.count();
}
非常感谢大家!现在它可以正常工作了。DATAJPA-231
如果能像find…By一样创建count…By…方法就太好了。例如:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}