क्या स्प्रिंग डेटा JPA में विधि नाम के उपयोग द्वारा प्रवेश करने की गणना करने का कोई तरीका है?


126

स्प्रिंग डेटा जेपीए विनिर्देशों का उपयोग करके गिनती संस्थाओं का समर्थन करता है। लेकिन क्या यह विधि नाम के उपयोग से संस्थाओं की गणना करने का कोई तरीका है? मान लीजिए कि मैं countByNameविशिष्ट नाम वाली संस्थाओं की गणना करने के लिए एक विधि चाहता हूं , जैसे findByNameविशिष्ट नाम वाले सभी संस्थाओं को लाने के लिए एक विधि ।


6
कृपया जवाब में से एक को स्वीकार करें, याओफेंग। मैंने स्प्रिंग डेटा जेपीए 1.5.2 और काउंटबायनाम () सिंटैक्स का परीक्षण हाबिल नोट्स के रूप में किया है।
nullPainter

जवाबों:


215

के रूप में वसंत डाटा 1.7.1.RELEASE आप दो अलग अलग तरीकों से यह कर सकते हैं,

1) क्वेरी और गणना दोनों को हटाने के लिए क्वेरी व्युत्पत्ति का उपयोग करते हुए नया तरीका । पढ़ें यह , (उदाहरण 5)। उदाहरण,

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

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

यह भी जवाब की जाँच करें ।


3
योग, औसत जैसे अन्य कुल कार्यों के बारे में क्या?
lrkwz

सवाल गिनती फ़ंक्शन के बारे में था, योग या औसत के बारे में नहीं। स्प्रिंग डेटा इस कार्य के लिए 'नए तरीके' जैसी किसी चीज़ का समर्थन नहीं करता है। आप कुछ इस
जॉर्ज सिगुरोग्लगू

1
आपके दूसरे और तीसरे उदाहरण में, मुझे लगता है कि आपको "SELECT COUNT (u) ..." का उपयोग करने की आवश्यकता होगी, क्योंकि यह एक गणना क्वेरी माना जाता है।
TheChrisPratt

आपकी टिप्पणी के लिये धन्यवाद। यह मेरी गलती थी।
जॉर्ज सिगुरोग्लोगो

गलत करने के लिए नहीं, यह पाया - कॉमन्स-लैंग
निकोज

19

जब तक आप 1.4 संस्करण का उपयोग नहीं करते हैं, आप स्पष्ट एनोटेशन का उपयोग कर सकते हैं:

उदाहरण:

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

3
ध्यान दें कि विधि को longइसके बजाय वापस आ जाना चाहिए int, अन्यथा आपको बिना किसी सुराग के क्लासकैस्ट एक्ससेप्शन मिलेगा
Rangi Lin

13

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

यह संस्करण मुझे सबसे अधिक पसंद है - खासकर जब से मैं एक सुराग नहीं बना सका कि यह कैसे मुद्राओं के अनुसार काम करना चाहिए :-) आपने मेरा दिन बचाया :-) एक टिप्पणी के रूप में: आदिम (जैसे int) को एक्सपेल-खोज में शामिल किया गया है, यानी int ageहालांकि सेट नहीं शामिल किया जाएगा, लेकिन Integer ageनमूना (कम से कम Eclipselink में) से बाहर रखा जाएगा
लियो

यही वह है जिसकी तलाश में मैं हूं। धन्यवाद!
एमक्रेगन


8

काम करने का उदाहरण

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

5

हाबिल के अनुसार, संस्करण 1.4 के बाद (संस्करण 1.4.3 में परीक्षण किया गया। कृपया) इस तरह से करना संभव है:

सार्वजनिक लंबी गिनतीनाम (स्ट्रिंग नाम);



2

आप सब का धन्यवाद! अब यह काम है।DATAJPA-231

यदि गिनती बनाना संभव हो तो अच्छा होगा ... द्वारा ... खोजने की तरह ही तरीके। उदाहरण:

public interface UserRepository extends JpaRepository<User, Long> {

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


1

मैं केवल कुछ हफ्तों के लिए इसके साथ काम कर रहा हूं, लेकिन मुझे विश्वास नहीं है कि यह कड़ाई से संभव है हालांकि आपको थोड़ा और प्रयास के साथ एक ही प्रभाव प्राप्त करने में सक्षम होना चाहिए; बस क्वेरी को स्वयं लिखें और विधि नाम को एनोटेट करें। यह शायद विधि लिखने की तुलना में बहुत आसान नहीं है, लेकिन यह मेरी राय में क्लीनर है।

संपादित करें: यह अब DATAJPA-231 के अनुसार संभव है


0
@Autowired
private UserRepository userRepository;

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

1
यह उदाहरण विषय से बाहर है। उपयोगकर्ता ने पूछा कि फ़ील्ड नाम की गणना कैसे करें और REST सेवा से मूल गणना कैसे करें।
जद बी।

0

यदि कोई भी यहां से कई शर्तों के आधार पर गिनती प्राप्त करना चाहता है तो एक नमूना कस्टम क्वेरी है

@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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.