繁体   English   中英

Spring Data JPA 是否有任何方法可以使用方法名称解析来计算实体?

[英]Does Spring Data JPA have any way to count entites using method name resolving?

Spring 数据 JPA支持使用规范对实体进行计数。 但是它有什么方法可以使用方法名称解析来计算实体吗? 假设我想要一个方法countByName来计算具有特定名称的实体,就像一个方法findByName来获取具有特定名称的所有实体。

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);
}

也检查这个所以回答

只要不使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM