পদ্ধতিটির নাম সমাধানের মাধ্যমে স্প্রিং ডেটা জেপিএর সাথে এনটাইটগুলি গণনা করার কোনও উপায় আছে কি?


125

স্প্রিং ডেটা জেপিএ স্পেসিফিকেশন ব্যবহার করে গণনা সত্তাকে সমর্থন করে। তবে পদ্ধতিটির নাম সমাধানের মাধ্যমে সত্তাগুলি গণনা করার কোনও উপায় আছে কি? ধরা যাক যে নির্দিষ্ট নাম সহ সমস্ত সত্ত্বা আনার countByNameপদ্ধতির মতো সুনির্দিষ্ট নামের সাথে সত্ত্বা গণনা করার জন্য আমি একটি পদ্ধতি চাই findByName


6
ইয়াওফ্যাং, উত্তরগুলির মধ্যে একটি গ্রহণ করুন। আমি স্প্রিং ডেটা জেপিএ 1.5.5 পরীক্ষা করেছি এবং কাউন্টবিয়নেম () সিনট্যাক্স হাবল নোট হিসাবে কাজ করে।
নালপেইন্টার

উত্তর:


214

স্প্রিং ডেটা ১.7.১. এর হিসাবে আপনি দুটি ভিন্ন উপায়ে এটি করতে পারেন,

1) নতুন উপায়ে , উভয় গণনা এবং প্রশ্নের মুছে ফেলার জন্য ক্যোয়ারী ডেরাইভেশন ব্যবহার করে। পড়ুন এই , (উদাহরণ 5)। উদাহরণ,

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

2) পুরানো উপায় , @ কিউরি টীকা ব্যবহার করে।
উদাহরণ,

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

বা @ পারম টীকা ব্যবহার করেও,

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

প্রশ্নটি গণনা ফাংশন সম্পর্কে ছিল, সমষ্টি বা গড় নয়। স্প্রিং ডেটা এই ফাংশনগুলির জন্য 'নতুন উপায়' এর মতো কিছু সমর্থন করে না। আপনি ভালো কিছু ব্যবহার করতে পারে এই
জর্জ Siggouroglou

1
আপনার দ্বিতীয় এবং তৃতীয় উদাহরণগুলিতে, আমি মনে করি আপনাকে "নির্বাচন নির্বাচন (ইউ) ..." ব্যবহার করা উচিত, যেহেতু এটি একটি গণনা কোয়েরি বলে মনে করা হচ্ছে।
TheChrisPratt

আপনার মন্তব্যের জন্য ধন্যবাদ. এটা আমার ভুল ছিল.
জর্জ সিগগ্রোগলু নভো

হাসিমুখে নয়, এটি খুঁজে পেয়েছে - কমন্স-ল্যাং
নিক জে

19

যতক্ষণ আপনি 1.4 সংস্করণ ব্যবহার করবেন না, আপনি সুস্পষ্ট টিকা ব্যবহার করতে পারেন:

উদাহরণ:

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

3
নোট করুন যে পদ্ধতিটি longপরিবর্তে ফিরে আসা উচিত int, অন্যথায় আপনি কোনও ক্লু ছাড়াই ক্লাসকাস্ট এক্সেক্সশন পাবেন
রাঙ্গি লিন

13

জেপাআরপোসিটোরি কোয়েরি বাই এক্সপ্ল্যান্স এক্সেকিউটারকেও প্রসারিত করে। সুতরাং আপনার ইন্টারফেসে কাস্টম পদ্ধতিগুলি সংজ্ঞায়িত করার দরকার নেই:

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 ageসেট না Integer ageথাকলেও অন্তর্ভুক্ত করা হবে তবে নমুনা থেকে বাদ দেওয়া হবে (কমপক্ষে এক্লিপসেলিংকে)
লিও

আমি ঠিক এটিই খুঁজছিলাম। ধন্যবাদ!
Emrekgn


8

কাজের উদাহরণ

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

ডিএও স্তর থেকে কল করা হচ্ছে

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

5

আবেলের মতে, সংস্করণ 1.4 এর পরে (সংস্করণ 1.4.3.RELEASE- এ পরীক্ষিত) এভাবে করা সম্ভব:

পাবলিক লং কাউন্টবাইনেম (স্ট্রিং নাম);



2

সবাইকে ধন্যবাদ! এখন এটি কাজ।DATAJPA-231

এটি গণনা তৈরি করা সম্ভব হলে ভাল হবে ... বাই দ্বারা… পদ্ধতিগুলি যেমন সন্ধানের মতো… অনুসারে। উদাহরণ:

public interface UserRepository extends JpaRepository<User, Long> {

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


1

আমি কেবল কয়েক সপ্তাহ ধরে এটি নিয়ে কাজ করছি তবে আমি বিশ্বাস করি না যে এটি কঠোরভাবে সম্ভব তবে আপনি আরও কিছুটা চেষ্টা করে একই প্রভাব পেতে সক্ষম হবেন; কেবল নিজেই ক্যোয়ারী লিখুন এবং পদ্ধতির নামটি বারণ করুন। পদ্ধতিটি নিজে লেখার চেয়ে এটি সম্ভবত খুব সহজ নয় তবে এটি আমার মতে পরিষ্কার।

সম্পাদনা করুন: এটি এখন ডেটাজেপিএ -৩৩১ অনুসারে সম্ভব


0
@Autowired
private UserRepository userRepository;

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

1
এই উদাহরণটি বিষয়বহির্ভূত। ব্যবহারকারী কীভাবে ক্ষেত্রের নাম গণনা করবেন এবং একটি আরএসটি পরিষেবা থেকে বেসিক গণনাটি কীভাবে কল করবেন তা জিজ্ঞাসা করলেন।
জাদ বি

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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.