Spring Data JPA 有没有使用方法名解析来计算实体的方法?

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

333719 次浏览

我使用它只有几个星期,但是我不相信这是完全可能的,但是你应该能够用更多的努力获得同样的效果; 只需要自己编写查询并注释方法名称。它可能不会比自己编写方法简单多少,但在我看来它更干净。

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

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

这个特性已经在版本1.4 M1中添加

显然,现在已经实现了 DATAJPA-231

只要不使用1.4版本,就可以使用显式注释:

例如:

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

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

Public long count ByName (字符串名称) ;

Spring Data 1.7.1开始,你可以用两种不同的方法,

  1. 新方法,对 count 和 delete 查询使用查询派生。 例如,
    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);
}

也检查 这就是答案

谢谢大家! 现在它的工作。 DATAJPA-231

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

public interface UserRepository extends JpaRepository<User, Long> {


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

JpaRepository 还扩展了 QueryByExampleExecator,所以你甚至不需要在你的接口上定义自定义方法:

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);
}
@Autowired
private UserRepository userRepository;


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

如果有人希望基于多个条件获得计数,这里是一个示例自定义查询

@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 Data JPA 支持使用规范计数实体。

他想使用名称解析的 JPA 规范,所有的答案都指向没有规范的 API。

只要我知道没有具有规范和名称解析的存储库实现。JpaSpeciationExecator 不支持它。

我遇到了同样的问题,并创建了一个自定义存储库,在其中使用了以下代码:

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”是一个包含属性名称的 String。