มีไวยากรณ์การสืบค้น HQL ในไฮเบอร์เนต แต่สิ่งที่เราคุ้นเคยมากขึ้นคือการนับงบ SQL แล้วเราจะให้การสนับสนุน SQL ได้อย่างไร? เราไม่จำเป็นต้องพิจารณาเรื่องนี้ทีมไฮเบอร์เนตได้ทำไปแล้ว
อย่าพูดเรื่องไร้สาระเพียงแค่ยกตัวอย่าง
เลือก * จาก t_user usr
ข้างต้นเป็นคำสั่ง SQL และเป็นเรื่องไร้สาระซึ่งทุกคนรู้ เราควรทำอย่างไรถ้า Hibernate ต้องการดำเนินการตามคำสั่งนี้? ดูรหัส:
Query Query = session.createsqlQuery ("เลือก * จาก t_user usr"); ทุกคนควรรู้ว่ามีอะไรเหลืออยู่และสิ่งที่เกิดขึ้นในการสอบถามเป็นเรื่องปกติ
แล้วจะส่งคืนอะไรหลังจากการสืบค้น?
ในขณะที่ (iter.hasnext ()) {object [] objs = (object []) iter.next (); สำหรับ (int i = 0; i <objs.length; i ++) {system.out.print (objs [i]); } system.out.println (); - ผลลัพธ์ที่ส่งคืนแต่ละรายการเป็นอาร์เรย์วัตถุ []
ในเวลานี้มีคนออกมาและบอกว่ามันมุ่งเน้นไปที่วัตถุ ใช่มันเป็นวัตถุที่มุ่งเน้นอนิจจาไม่มีทาง
ดูต่อไป:
เลือก {usr.*} จาก t_user usr เมื่อเห็นสิ่งนี้ฉันเดาว่ารองเท้าเด็กบางคนเริ่มเคลื่อนไหว วงเล็บปีกกาคืออะไร?
ไม่ต้องกังวลใช้เวลาของคุณ มาอ่านรหัสต่อไปก่อน
การคัดลอกรหัสมีดังนี้:
Query Query = session.createsqlQuery ("เลือก {usr.*} จาก t_user usr"). addentity (tuser.class);
addentitySqlQuery edentity (String tablealias, class entityType) ประกาศ entityparameters "root": tablealias - SQL Table aliasentityType - ประเภท Java ของเอนทิตีเพื่อเพิ่มเป็นรูท
มันเหมือนกับมันมันดูดเล็กน้อย คุณสามารถใช้มันเองเท่านั้น
พารามิเตอร์แรกหมายถึงนามแฝงของตาราง เช่นเดียวกับคำแถลงข้างต้นนามแฝงของตารางของเราคือ USR ดังนั้นพารามิเตอร์แรกคือ USR และที่สองหมายถึงคลาสที่ผลลัพธ์การสืบค้นต้องถูกแมปไป ที่นี่เนื่องจากเราแมปไปยังตาราง T_USER ผ่าน TUSER ในไฟล์การแมปเราจึงเป็น TUSER ที่นี่แน่นอน จากนั้นหลังจากตรวจสอบมีคำสั่ง SQL และผลลัพธ์เป็นประเภท TUSER
ผลลัพธ์ที่เราพบคือ:
org.hibernate.tutorial.domain6.tuser@198cb3d
แน่นอนคุณต้องแตกต่างจากของฉัน อย่าขยับไก่
บางทีเราอาจไม่จำเป็นต้องค้นหาทุกสิ่งในเวลานี้สิ่งที่เราต้องการคือการตั้งค่านามแฝง:
เลือก u.id เป็น {usr.id}, u.name เป็น {usr.name}, u.age เป็น {usr.age} จาก t_user u เราเห็นว่าเราใช้เพื่อระบุนามแฝงสำหรับฟิลด์และสิ่งเดียวกันนั้นเป็นจริงในโปรแกรม:
การคัดลอกรหัสมีดังนี้:
Query Query = session.createsqlQuery ("เลือก U.ID เป็น {usr.id}, u.name เป็น {usr.name}, u.age เป็น {usr.age} จาก t_user u"). addentity ("usr", tuser.class);
<sql-query name = "querytuser"> <return alias = "usr" entity-name = "org.hibernate.tutorial.domain6.tuser" /> เลือก {usr.*} จาก t_user usr ที่ชื่อ =: ชื่อ < /sql-query> โปรดทราบว่าเอนทิตีชื่อที่นี่จะต้องเขียนด้วยชื่อแพ็คเกจที่สมบูรณ์มิฉะนั้นจะมีการรายงานข้อผิดพลาด ที่นี่เรามีคำบรรยายกลับมาซึ่งระบุชื่อนามแฝงและคลาสของตารางเพื่อที่เราจะได้ไม่จำเป็นต้องติดตั้งที่รันไทม์
ดูรหัส:
Query Query = session.getNamedQuery ("QueryTuser"); query.setParameter ("ชื่อ", "Shun"); รายการรายการ = query.list (); Iterator iter = list.iterator ();
เราโอเคเช่นนี้ โปรดทราบว่าเรายังไม่ได้เพิ่มสารเสพติดส่วนใหญ่เนื่องจากการกำหนดค่าในไฟล์การกำหนดค่า
โปรดทราบว่าหากกำหนดค่าในไฟล์การกำหนดค่าคุณต้องมีการส่งคืนข้อมูลย่อยเพื่อระบุนามแฝงของตารางและชื่อคลาส สิ่งนี้ส่วนใหญ่หลีกเลี่ยงการตัดสินซ้ำ ๆ เมื่ออ่านงบ
หลังจากพูดถึงเรื่องนี้มานานแล้วเราได้พูดถึงโต๊ะที่มีนามแฝง ดังนั้นเราควรทำอย่างไรถ้าตารางของเราไม่มีนามแฝง แต่เราต้องการห่อหุ้มผลลัพธ์ในวัตถุ?
เลือก * จาก t_user usr
มันง่ายมาก เพียงแค่การโทรหาวิธีการที่โอเวอร์โหลดของ Addentity (Class Clazz) และคุณต้องให้ชื่อคลาสโดยไม่มีนามแฝงของตาราง
แน่นอนว่าไฮเบอร์เนตยังสนับสนุนขั้นตอนที่เก็บไว้ คุณจะต้องตั้งค่าคุณสมบัติ callable ของ SQL-Query เป็น TRUE ในไฟล์การกำหนดค่าเพื่อระบุว่าขั้นตอนที่เรียกว่าเก็บไว้ในปัจจุบัน เนื่องจากฉันไม่ได้ติดต่อกับขั้นตอนที่เก็บไว้มากฉันจะศึกษาพวกเขามากขึ้นในอนาคตและศึกษากับคุณ
เมื่อเราเรียกวิธีการที่สอดคล้องกันของการดำเนินการข้อมูลเช่น session.save มันจะถูกแปลงเป็นคำสั่ง SQL ในตัวของ Hibernate แต่ถ้าเราต้องการควบคุมรูปแบบของคำสั่ง SQL ด้วยตนเอง
ไฮเบอร์เนตก็คิดเช่นกัน
เราเพิ่มลงในไฟล์การแมปโดยตรง:
<sql-insert> แทรกลงใน t_user (ชื่อ, อายุ) ค่า (?,?) </sql-insert> <sql-update> อัปเดตชุดผู้ใช้ user_name =?, age =? user_id = ที่ไหน? </sql-update>
โปรดทราบว่าสิ่งนี้จะต้องเพิ่มในแท็กคลาสเป็นคำบรรยาย เราทุกคนเป็นตัวพิมพ์ใหญ่ที่นี่เพื่อแยกแยะพวกเขาออกจากข้อความเริ่มต้นของไฮเบอร์เนตและไม่มีความหมายอื่น
ก่อนอื่นดูการโทรเพื่อแทรก:
ผู้ใช้ผู้ใช้ = ผู้ใช้ใหม่ (); user.setName ("shun123123"); user.setage (23); เมื่อเราโทรบันทึกคำสั่งไฮเบอร์เนตคือ:
ไฮเบอร์เนต:
แทรกลงในผู้ใช้ (user_name, อายุ) ค่า (?,?)
มันเรียกคำสั่งในแท็ก SQL-Insert ที่เรากำหนดค่ามาดูการโทรเพื่ออัปเดต:
ผู้ใช้ผู้ใช้ = (ผู้ใช้) เซสชัน get (user.class, ใหม่ยาว (29)); user.setName ("shun123123"); user.setage (23); session.save (ผู้ใช้); เราเรียกบันทึกมันจะเรียกอัพเดตโดยอัตโนมัติและคำสั่งในเวลานี้คือ:
ไฮเบอร์เนต:
อัปเดตชุดผู้ใช้ user_name =?, age =? user_id = ที่ไหน?เราเห็นว่าคำสั่งเอาต์พุตเป็นตัวพิมพ์ใหญ่ซึ่งหมายความว่าคำสั่งที่เรากำหนดค่านั้นเรียกว่า