Spring Data JPA có bất kỳ cách nào để đếm số lần truy cập bằng cách sử dụng phân giải tên phương thức không?


127

Spring Data JPA hỗ trợ đếm các thực thể bằng cách sử dụng các đặc tả. Nhưng nó có cách nào để đếm các thực thể bằng cách sử dụng phân giải tên phương thức không? Giả sử tôi muốn một phương thức countByNameđể đếm các thực thể có tên cụ thể, giống như một phương thức findByNameđể tìm nạp tất cả các thực thể có tên cụ thể.


6
Hãy chấp nhận một trong những câu trả lời, YaoFeng. Tôi đã thử nghiệm Spring Data JPA 1.5.2 và cú pháp countByName () hoạt động như ghi chú Abel.
nullPainter

Câu trả lời:


216

Kể từ Spring Data 1.7.1.RELEASE, bạn có thể làm điều đó bằng hai cách khác nhau,

1) Cách mới , sử dụng dẫn xuất truy vấn cho cả truy vấn đếm và xóa. Đọc này , (Ví dụ 5). Thí dụ,

public interface UserRepository extends CrudRepository<User, Integer> {
    Long countByName(String name);
}

2) Cách , sử dụng chú thích @Query.
Thí dụ,

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

hoặc sử dụng chú thích @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);
}

Cũng kiểm tra điều này để trả lời .


3
còn các hàm tổng hợp khác như tổng, trung bình thì sao?
lrkwz

Câu hỏi là về hàm đếm, không phải tổng hay trung bình. Dữ liệu mùa xuân chưa hỗ trợ một cái gì đó giống như 'cách mới' cho các chức năng này. Bạn có thể sử dụng giống như này
George Siggouroglou

1
Trong ví dụ thứ hai và thứ ba của bạn, tôi nghĩ bạn sẽ cần sử dụng "SELECT COUNT (u) ...", vì đây được coi là một truy vấn đếm.
TheChrisPratt

Cảm ơn bình luận của bạn. Đó là sai lầm của tôi.
George Siggouroglou

Không phải sợ hãi, đã tìm thấy nó - commons-lang
NickJ

19

Miễn là bạn không sử dụng phiên bản 1.4, bạn có thể sử dụng chú thích rõ ràng:

thí dụ:

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

3
lưu ý rằng phương pháp này nên trở lại longthay vì int, nếu không bạn sẽ nhận được một ClassCastException mà không cần bất kỳ manh mối
rangi Lin

13

JpaRepository cũng mở rộng QueryByExampleExecutor. Vì vậy, bạn thậm chí không cần xác định các phương thức tùy chỉnh trên giao diện của mình:

public interface UserRepository extends JpaRepository<User, Long> {
    // no need of custom method
}

Và sau đó truy vấn như:

User probe = new User();
u.setName = "John";
long count = repo.count(Example.of(probe));

Phiên bản này tôi thích nhất - đặc biệt là vì tôi không thể biết cách này sẽ hoạt động như thế nào theo tài liệu :-) Bạn đã lưu ngày của tôi :-) Như một nhận xét: Các nguyên thủy (ví dụ: int) được bao gồm trong tìm kiếm expamle, tức là int agesẽ được bao gồm mặc dù không được thiết lập, nhưng Integer agesẽ bị loại trừ khỏi mẫu (ít nhất là trong Eclipselink)
LeO

Điều này thật đúng với gì mà tôi đã tìm kiếm. Cảm ơn bạn!
emrekgn


8

Ví dụ làm việc

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

Gọi từ lớp DAO

@Override
public long countByTenantName(String tenantName) {
    return repository.countByTenantName(tenantName);
}

5

Theo Abel, sau phiên bản 1.4 (được thử nghiệm trong phiên bản 1.4.3.RELEASE), bạn có thể thực hiện theo cách này:

public long countByName (Tên chuỗi);



2

Cảm ơn tất cả các bạn! Bây giờ nó hoạt động. DATAJPA-231

Sẽ thật tuyệt nếu có thể tạo ra số lượng… Bằng… các phương pháp giống như tìm… Theo từng cái. Thí dụ:

public interface UserRepository extends JpaRepository<User, Long> {

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


1

Tôi chỉ mới làm việc với nó được vài tuần nhưng tôi không tin rằng điều này là hoàn toàn có thể, tuy nhiên bạn sẽ có thể đạt được hiệu quả tương tự với một chút nỗ lực; chỉ cần tự viết truy vấn và chú thích tên phương thức. Nó có lẽ không đơn giản hơn nhiều so với việc tự viết phương pháp nhưng theo tôi thì nó rõ ràng hơn.

Chỉnh sửa: bây giờ có thể theo DATAJPA-231


0
@Autowired
private UserRepository userRepository;

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

1
Ví dụ này nằm ngoài chủ đề. Người dùng đã hỏi cách đếm bằng tên trường chứ không phải cách gọi số đếm cơ bản từ dịch vụ REST.
Jad B.

0

Nếu bất kỳ ai muốn nhận số lượng dựa trên nhiều điều kiện thì đây là một truy vấn tùy chỉnh mẫu

@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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.