Spring Data JPA有没有办法使用方法名称解析来计算entites?

Yao*_*eng 109 java spring spring-data-jpa

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

Geo*_*lou 184

Spring Data 1.7.1.RELEASE开始,你可以用两种不同的方式来做,

1)新方法,使用查询推导计数和删除查询.阅读本文,(例5).例,

public interface UserRepository extends CrudRepository<User, Integer> {
    Long countByName(String name);
}
Run Code Online (Sandbox Code Playgroud)

2)旧方法,使用@Query注释.
例,

public interface UserRepository extends CrudRepository<User, Integer> {
    @Query("SELECT COUNT(u) FROM User u WHERE u.name=?1")
    Long aMethodNameOrSomething(String name);
}
Run Code Online (Sandbox Code Playgroud)

或者也使用@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);
}
Run Code Online (Sandbox Code Playgroud)

检查这个答案.

  • 那么其他聚合函数如sum,average? (3认同)

小智 17

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

例:

@Query("select count(e) from Product e where e.area.code = ?1")
int countByAreaCode(String code);
Run Code Online (Sandbox Code Playgroud)

  • 请注意,该方法应该返回`long`而不是`int`,否则你将得到一个没有任何线索的ClassCastException (3认同)

小智 13

工作示例

@Repository
public interface TenantRepository extends JpaRepository< Tenant, Long > {
    List<Tenant>findByTenantName(String tenantName,Pageable pageRequest);
    long countByTenantName(String tenantName);
}
Run Code Online (Sandbox Code Playgroud)

从 DAO 层调用

@Override
public long countByTenantName(String tenantName) {
    return repository.countByTenantName(tenantName);
}
Run Code Online (Sandbox Code Playgroud)


L. *_*nda 11

JpaRepository还扩展了QueryByExampleExecutor.因此,您甚至不需要在界面上定义自定义方法:

public interface UserRepository extends JpaRepository<User, Long> {
    // no need of custom method
}
Run Code Online (Sandbox Code Playgroud)

然后查询如下:

User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));
Run Code Online (Sandbox Code Playgroud)


Abe*_*tur 10

版本1.4 M1中添加了此功能


小智 5

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


Mar*_*nes 5

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

public long countByName(String name);


Mar*_*und 1

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

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