พูดคุยเกี่ยวกับการสืบค้นเกณฑ์ซึ่งเป็นเรื่องง่ายสำหรับโปรแกรมเมอร์ของสหรัฐอเมริกาที่ไม่คุ้นเคยกับคำสั่ง SQL
โดยไม่ต้องกังวลใจเพิ่มเติมลองมาดูตัวอย่าง:
คลาสเอนทิตีมีดังนี้:
ผู้ใช้ระดับสาธารณะใช้ serializable {ส่วนตัวคงที่สุดท้าย Long SerialVersionUID = 1L; ID ยาวสาธารณะ; ชื่อสตริงส่วนตัว; อายุ int ส่วนตัว; // omit get/set method} เราจะไม่เขียนไฟล์การแมปมันเป็นเอนทิตีที่ง่ายมาก หากคุณไม่เข้าใจรองเท้าเด็กโปรดดูบทความอื่น ๆ ของฉันในหมวด Hibernate
ถัดไปมาดูกันว่าจะใช้เกณฑ์ในการสอบถาม:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {การกำหนดค่า cfg = การกำหนดค่าใหม่ (). configure (); SessionFactory SessionFactory = cfg.buildsessionFactory (); เซสชัน = sessionfactory.opensession (); เกณฑ์เกณฑ์ = session.createCriteria (user.class); Criteria.add (ข้อ จำกัด eq ("ชื่อ", "Shun")); list list = criteria.list (); Iterator iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {user user = (ผู้ใช้) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); - เมื่อเห็นรหัสมันเป็นสตริงที่ง่ายมาก
เราทุกคนคุ้นเคยกับชื่อก่อนหน้านี้และเราเห็นรหัสหลังจากสร้างเซสชัน:
เกณฑ์เกณฑ์ = session.createCriteria (user.class); Criteria.add (ข้อ จำกัด eq ("ชื่อ", "Shun")); รหัสสองประโยคนี้เป็นประเด็นสำคัญ มาวิเคราะห์ว่ามันหมายถึงอะไรกันแน่?
ในประโยคแรกเราได้รับวัตถุของคลาสการใช้งานเกณฑ์ผ่านเซสชันและในประโยคที่สองเราเพิ่มเงื่อนไขผ่านวิธีการเพิ่มและ EQ แสดงถึงความเท่าเทียมกัน Hibernate3 เคยถูกนำไปใช้ก่อนหน้านี้ผ่าน Expression.eq หลังจาก 3 เนื่องจากเกณฑ์ถูกทอดทิ้งเราจึงใช้คลาสข้อ จำกัด ในการใช้งานซึ่งเหมือนกับการแสดงออก ลองดู API และพบว่าการแสดงออกนั้นสืบทอดมาจากข้อ จำกัด
กลับไปที่สองประโยคด้านบนหลังจากที่เราทำภารกิจเหล่านี้เสร็จแล้วไฮเบอร์เนตช่วยเราสร้างสิ่งที่คล้ายกันจริง
เลือก * จากผู้ใช้ที่ Name = 'Shun'
ข้อความดังกล่าว (ที่นี่ตารางที่สอดคล้องกับคลาสผู้ใช้ในไฟล์การแมปของเราคือตารางผู้ใช้และแอตทริบิวต์ชื่อสอดคล้องกับฟิลด์ชื่อ)
ข้อ จำกัด ยังมีวิธีการมากมายที่จะช่วยเราสร้างคำสั่ง SQL มันง่ายที่จะเข้าใจหลังจากตรวจสอบ API
ลองดูรหัสข้างต้นอีกครั้ง ถ้าเราปิดเซสชัน แต่เราต้องการใช้เกณฑ์นี้ต่อไปใช่ไหม? มาดูกันเถอะ
หลังจากรหัสด้านบนเราเดินทางอีกครั้งเพิ่ม:
List List2 = Criteria.list (); ตัววนซ้ำ iter2 = list.iterator (); ในขณะที่ (iter.hasnext ()) {user user = (ผู้ใช้) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); - เพื่อแยกแยะความแตกต่างระหว่างรายการก่อนหน้าและ ITER เราใช้อีกรายการหนึ่งที่นี่
เรียกใช้และเราได้รับข้อยกเว้น:
org.hibernate.sessionException: เซสชันปิด!
การรายงานข้อยกเว้นนี้หมายความว่าเซสชันถูกปิด ในหลายกรณีเราจะรายงานข้อยกเว้นที่คล้ายกันหลังจากปิดเซสชันจากนั้นทำการดำเนินการที่เกี่ยวข้องกับ saveorupdate, บันทึก ฯลฯ
Hibernate3 คำนึงถึงความต้องการของเราและดำเนินการ DetachedCriteria ซึ่งสามารถเป็นอิสระจากเซสชัน
ลองมาดูตัวอย่าง: (เอนทิตีหรือด้านบน)
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {การกำหนดค่า cfg = การกำหนดค่าใหม่ (). configure (); SessionFactory SessionFactory = cfg.buildsessionFactory (); เซสชัน = sessionfactory.opensession (); DECTACHEDCRITERIA DEPRITERIA = DETACHEDCRITERIA.FORCLASS (USER.CLASS); decriteria.add (ข้อ จำกัด eq ("ชื่อ", "shun")); list list = decriteria.getExecutableCriteria (เซสชัน) .List (); Iterator iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {user user = (ผู้ใช้) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); เซสชั่นเซสชัน 2 = sessionfactory.opensession (); List List2 = Decriteria.getExecutableCriteria (Session2) .List (); ตัววนซ้ำ iter2 = list2.iterator (); ในขณะที่ (iter2.hasnext ()) {user user = (ผู้ใช้) iter2.next (); System.out.println (user.getName ()+":"+user.getage ()); - เราเห็นว่าหลังจากปิดเซสชันเราสามารถใช้ DetachedCriteria ในการเชื่อมต่ออื่นต่อไป เราจำเป็นต้องเชื่อมโยง DetachedCriteria ปัจจุบันกับเซสชันที่แน่นอนผ่าน GetExecutableCriteria (เซสชันเซสชัน)
ถัดไปลองดูที่การรวมกันของคลาส subqueries และ detachedcriteria:
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {การกำหนดค่า cfg = การกำหนดค่าใหม่ (). configure (); SessionFactory SessionFactory = cfg.buildsessionFactory (); เซสชัน = sessionfactory.opensession (); DECTACHEDCRITERIA DEPRITERIA = DETACHEDCRITERIA.FORCLASS (USER.CLASS); decriteria.setProject (projections.avg ("อายุ")); เกณฑ์เกณฑ์ = session.createCriteria (user.class); Criteria.add (subqueries.propertygt ("อายุ", decriteria)); list list = criteria.list (); Iterator iter = list.iterator (); ในขณะที่ (iter.hasnext ()) {user user = (ผู้ใช้) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); - ฉันเดาว่าประโยครหัสแรกที่คุณมีคำถาม:
decriteria.setProject (projections.avg ("อายุ")); รหัสนี้หมายถึงการได้รับค่าเฉลี่ยของอายุผ่านการลดลง จากนั้นรับวัตถุที่มีอายุมากกว่าค่าเฉลี่ยด้านล่าง
การคาดการณ์มีวิธีการห่อหุ้มจำนวนมากที่ใช้วิธี SQL คุณสามารถดู API
มาเรียนรู้เกี่ยวกับการใช้งานที่สูงขึ้นเล็กน้อย
เพียงแค่ดูรหัส:
Criteria.setFirstresult (10); Criteria.setMaxResults (20);
ที่นี่เราตั้งค่าบันทึกการเริ่มต้นเป็นข้อ 10 จากนั้นค้นหา 20 ระเบียนจากมาตรา 10 ตามการปฏิบัตินี้เราสามารถใช้ฟังก์ชั่นการเพจพื้นฐาน
แน่นอนว่าเราจำเป็นต้องมีการเรียงลำดับในหลาย ๆ กรณีและเกณฑ์ก็สนับสนุนด้วย:
Criteria.addorder (order.desc ("อายุ")); ที่นี่เราสามารถใช้วิธี addorder โดยตรงและรับวัตถุสั่งซื้อผ่าน order.desc ซึ่งต้องใช้พารามิเตอร์แอตทริบิวต์ ในความเป็นจริงเมื่อเราโทรหา Addorder ไฮเบอร์เนตจะช่วยเราสร้างคำสั่งซื้อตามอายุเช่นคำสั่งดังกล่าว
เราจะทำสิ่งนี้ได้อย่างไรเมื่อเราต้องการจัดกลุ่มมัน? สิ่งนี้ต้องใช้วิธีการ groupproperty ของคลาสการคาดการณ์ที่เราพูดถึงครั้งสุดท้าย
Criteria.SetProjection (projections.groupproperty ("อายุ")); ที่นี่เราจัดกลุ่มตามแอตทริบิวต์อายุซึ่งจริง ๆ แล้วถูกจัดกลุ่มผ่านอายุภาคสนามที่สอดคล้องกับอายุ Hibernate จะแปลงเป็นคำสั่งเช่นกลุ่มตามอายุโดยอัตโนมัติ
มีวิธีการปฏิบัติหลายอย่างในการคาดการณ์ (โปรดทราบว่าสิ่งนี้มีให้เฉพาะหลังจากไฮเบอร์เนต 3)