হাইবারনেট (~ ২০০৯) এর পুরানো সংস্করণগুলি ব্যবহার করে আমরা কীভাবে সারিগুলি গণনা করব?


242

উদাহরণস্বরূপ, যদি আমাদের একটি টেবিল বই থাকে, তবে কীভাবে আমরা হাইবারনেট সহ বইয়ের রেকর্ডের মোট সংখ্যা গণনা করব?

উত্তর:


310

হাইবারনেট (<5.2) এর পুরানো সংস্করণগুলির জন্য:

শ্রেণীর নাম গ্রন্থটি ধরে নেওয়া:

return (Number) session.createCriteria("Book")
                  .setProjection(Projections.rowCount())
                  .uniqueResult();

এটি কমপক্ষে একটি Number, সম্ভবত এ Long


10
এটি একটি দীর্ঘ ফিরে।
dj_segfault

10
@ স্যালান্দুর পরামর্শ হিসাবে, "এটি কমপক্ষে একটি সংখ্যা", এবং সংখ্যা টাইপের "ইনটালিউ ()", "লংভ্যালু ()" পদ্ধতি রয়েছে, তাই আমরা সহজেই আমাদের পছন্দসই আদিম প্রকারটি পেতে পারি: ()) intValue ()
জেরি টিয়ান

5
যদি সত্তা ম্যাপিংটি তৈরির মানদণ্ড পদ্ধতিতে স্ট্রিং প্যারামিটার ব্যবহার করে খুঁজে পাওয়া যায় না, সেশন কোড ক্রিয়েট ক্রিটরিয়া (Book.class) এছাড়াও ব্যবহার করা যেতে পারে
টোবিয়াস এম

5
@ মন্টিবোঙ্গো যেমন বলেছে, আমাকে আসলে ক্লাসটি উল্লেখ করতে হয়েছিল: return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
বিএমএমনি

2
তারপরে আপনার যুক্তিযুক্ত ডাটাবেস ব্যবহার করা উচিত নয়;)। দীর্ঘতম সর্বাধিক মান 9,223372037 × 10¹⁸, যা লাআআআআআআআআর্জে
সালানদুর

102

জাভাতে আমার সাধারণত ফিরে আসা এবং এই ফর্মটি ব্যবহার করতে হবে:

int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();

1
এই প্রশ্নের গৃহীত উত্তর আমার পক্ষে কাজ করে নি, তবে আপনার কাজটি হয়েছে। ধন্যবাদ!
জেসন নিকোলস

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

57
আমরা যদি কোনওভাবে এসকিউএল কোডিংয়ের কাজ শেষ করি তবে একটি ওআরএম ব্যবহার করার কী দরকার?
থার্মজ

এটাই আমার মূল উদ্বেগ (এইচকিউএল এর পরিবর্তে এসকিউএল ব্যবহার করা)। বাম বাহ্যিক যোগদানের পরে আসা সারিগুলির সংখ্যা গণনা করার জন্য আমাকে নেস্টেড SELECT ব্যবহার করতে হবে (হাইবারনেটে বাম বাহিরের জোনের সঠিক প্রয়োগ আমি পাইনি)।
প্রমোদ

15
প্রথমত, এই সমাধানটি এসকিউএল ব্যবহার করে না, এটি এইচকিউএল। এবং 'ই ই থেকে গণনা নির্বাচন করুন (ই) এর পরিবর্তে গণনা (*) ব্যবহার করুন বা মানদণ্ডগুলি @ এম্বেডডআইডি এবং ডেটাবেসগুলির সাথে কাজ করে যা টুপল কাউন্ট সমর্থন করে না (যেমন, মাইএসকিউএল, যেখানে' নির্বাচন গণনা ((ক, খ)) এর মতো প্রশ্নগুলি ) টেবিল 1 থেকে 'কাজ করে না)।
BrunoJCM

43

এখানে কি সরকারী হাইবারনেট ডক্স বলতে আমাদের এই সম্পর্কে:

আপনি কোয়েরির ফলাফলগুলি না দিয়েই তাদের সংখ্যা গণনা করতে পারেন:

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

তবে এটি সর্বদা Integerনজরে আসে না , তাই java.lang.Numberসুরক্ষার জন্য ব্যবহার করা ভাল ।


1
হাইবারনেট টিমকে প্রস্তাবিত পদ্ধতি দেয় এমন উত্তরের জন্য +1।
টম

3
আমার জন্য এটি "java.lang.ClassCastException: java.lang.Long java.lang.Integer এ কাস্ট করা যাবে না" তবে লংয়ের পরিবর্তে কাজ করা ...
রজারডপ্যাক

2
@rogerdpack এর কারণ হিবারনেট ফিরতি টাইপটি 3.5 তে পরিবর্তন করে লংয়ে রেখেছে: community.jboss.org/wiki/HibernateCoreMigrationGuide35
যন্ত্রপাতি

1
গণনা ফাংশনের জন্য রিটার্নের org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
ধরণটি

12

আপনি চেষ্টা করতে পারেন count(*)

Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();

Booksনামটি কোথায় বন্ধ class- ডাটাবেসে সারণী নয়।


দুঃখিত তবে এটি জাভা এবং হাইবারনেটের সাথে কাজ করছে না :( (টাইপ কাস্টিংয়ের জন্য এটি জাভাতে রয়েছে বলে আমি পূর্ণসংখ্যার সাথে প্রতিস্থাপন করেছি))
কারিগর

এটি কাজ করা উচিত - int এর পরিবর্তে পূর্ণসংখ্যার সাথে? আপনার এইচকিউএল এ ক্লাসের নাম রাখা দরকার, টেবিলের নাম নয় - কেবলমাত্র আমি ভাবতে পারি এটি ভুল হতে পারে
জন স্পোকস

1
আমি বিশ্বাস করি যে এর নীচে পোস্টটি মূল হাইবারনেট নীতিগুলির সাথে সামঞ্জস্যপূর্ণ।
ম্যাট সাইডসিংগার

আমার জন্য এটি জাভা এবং হাইবারনেটের সাথে কাজ করছে না। পরিবর্তে কি করতে হবে?
r পার্বতী

6

আপনি যদি হাইবারনেট 5+ ব্যবহার করেন তবে ক্যোয়ারী হিসাবে সংশোধন করা হবে

Long count = session.createQuery("select count(1) from  Book")
                    .getSingleResult();

অথবা আপনার যদি টাইপকুইয়ের প্রয়োজন হয়

Long count = session.createQuery("select count(1) from  Book",Long.class)
                        .getSingleResult();

6
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();

এটা তোলে লং কাউন্ট be``` উচিত = (দীর্ঘ) session.createQuery ( "নির্বাচন গণনা (1) বই থেকে") uniqueResult (); `` এটা কর্মক্ষমতা উন্নত করতে হবে।
rajadilipkolli

1

এটি হাইবারনেট 4 (পরীক্ষিত) এ কাজ করে।

String hql="select count(*) from  Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;

গেটকন্টারসেশন () কোথায়:

@Autowired
private SessionFactory sessionFactory;


private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}

1

এটি খুব সহজ, কেবল নিম্নলিখিত JPQL কোয়েরিটি চালান:

int count = (
(Number)
    entityManager
    .createQuery(
        "select count(b) " +
        "from Book b")
    .getSingleResult()
).intValue();

আমরা কাস্টিংয়ের কারণটি Numberহ'ল কিছু ডাটাবেস ফিরে আসবে Longযখন অন্যেরা ফিরে আসবে BigInteger, সুতরাং বহনযোগ্যতার জন্য আপনি কয়টি সারি গণনা করবেন তার উপর নির্ভর করে আপনি একটিতে কাস্টিং Numberএবং একটি intবা একটি পাওয়ার চেয়ে ভাল long

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