[英]Does Spring Data JPA have any way to sum an entity column using method name resolving?
[英]Does Spring Data JPA have any way to count entites using method name resolving?
Spring 数据 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);
}
也检查这个所以回答。
只要不使用1.4版本,就可以使用显式注解:
例子:
@Query("select count(e) from Product e where e.area.code = ?1")
long countByAreaCode(String code);
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));
工作示例
@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 版本中添加
显然它现在已经实现了DATAJPA-231
根据 Abel 的说法,在 1.4 版(在 1.4.3.RELEASE 版中测试)之后,可以这样做:
public long countByName(String name);
谢谢大家! 现在开始工作了。 DATAJPA-231
如果可以像 find...By 那样创建 count...By... 方法就好了。 例子:
public interface UserRepository extends JpaRepository<User, Long> {
public Long /*or BigInteger */ countByActiveTrue();
}
@Autowired
private UserRepository userRepository;
@RequestMapping("/user/count")
private Long getNumberOfUsers(){
return userRepository.count();
}
我只用了几个星期,但我不相信这是完全可能的,但是你应该能够通过更多的努力获得相同的效果; 只需自己编写查询并注释方法名称。 它可能并不比自己编写方法简单多少,但在我看来它更清晰。
编辑:现在可以根据DATAJPA-231
根据问题DATAJPA-231,该功能尚未实现。
如果有人想根据多个条件获取计数,那么这里是一个示例自定义查询
@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);
在我看来,其他解决方案没有回答这个问题。 根据句子
Spring 数据 JPA 支持使用规范对实体进行计数。
他想使用 JPA 规范进行名称解析。 所有答案都指向 api 没有规格。
据我所知,没有带有规范和名称解析的存储库实现。 JpaSpecificationExecutor 不支持它。
我遇到了同样的问题并创建了一个自定义存储库,我在其中使用了如下代码:
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> query = builder.createQuery(Long.class);
Root<S> root = query.from(domainClass);
Path<Object> attribute = root.get(attributeName);
query.select(builder.countDistinct(attribute));
if(spec == null){
return em.createQuery(query);
}
Predicate predicate = spec.toPredicate(root, query, builder);
if(predicate != null){
query.where(predicate);
}
return em.createQuery(query);
变量“attributeName”是一个带有属性名称的字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.