ใน JPA 2.0 เราสามารถใช้ EntityManager.CreatenativeQuery () เพื่อเรียกใช้คำสั่ง SQL ดั้งเดิม แต่เมื่อผลลัพธ์การสืบค้นของเราไม่มีคลาสเอนทิตีที่สอดคล้องกัน query.getResultList () ส่งคืนรายการ <object []> กล่าวคือข้อมูลของแต่ละแถวจะถูกส่งกลับเป็นอาร์เรย์วัตถุ
การใช้งานทั่วไปคือ:
Public Void TestnativeQuery () {Query Query = EntityManager.CreatenativeQuery ("เลือก ID, ชื่อ, อายุจาก t_user"); รายการรายการ = query.getResultList (); สำหรับ (แถววัตถุ: แถว) {Object [] cells = (Object []) แถว; System.out.println ("id =" + เซลล์ [0]); System.out.println ("name =" + เซลล์ [1]); System.out.println ("Age =" + เซลล์ [2]); -ด้วยวิธีนี้มันจะทำให้รหัสยากมากที่จะเข้าใจ องค์ประกอบที่มีตัวห้อยเป็น 0 คืออะไร? ไม่มีใครรู้ว่าคุณไม่นับคำสั่งแบบสอบถาม ยิ่งไปกว่านั้นเมื่อมีการปรับคำสั่งแบบสอบถามแล้วรหัส Java จะต้องปรับด้วยกัน ในเวลานี้เราคิดว่าหากแผนที่ถูกส่งคืนมันจะชัดเจนกว่าที่จะใช้
น่าเสียดายที่ API ของ JPA ไม่ได้ให้การตั้งค่าดังกล่าว ในความเป็นจริงการใช้งาน JPA พื้นฐานจำนวนมากสนับสนุนการส่งคืนวัตถุแผนที่
ตัวอย่างเช่น:
eclipselink query.sethint (queryhints.result_type, resulttype.map); . setResultTransformer ของ Hibernate (transformers.alias_to_entity_map);
ดังนั้นหากเราต้องการส่งคืนแผนที่และพิจารณาว่าเลเยอร์พื้นฐานกำลังใช้การใช้งาน JPA บางอย่างเราสามารถทำตามขั้นตอนต่อไปและเสียสละคุณลักษณะการดำเนินการข้ามเพื่อตอบสนองความต้องการของเรา:
Public Void TestnativeQuery () {Query Query = EntityManager.CreatenativeQuery ("เลือก ID, ชื่อ, อายุจาก t_user"); query.unWrap (sqlQuery.class) .setResultTransformer (transformers.alias_to_entity_map); รายการรายการ = query.getResultList (); สำหรับ (Object OBJ: แถว) {MAP ROW = (MAP) OBJ; System.out.println ("id =" + row.get ("id")); System.out.println ("name =" + row.get ("ชื่อ")); System.out.println ("age =" + row.get ("อายุ")); -แบบสอบถามส่งคืนวิธีการเขียนของประเภทการส่งคืนเอนทิตีที่ระบุ
Query Query = EntityManager.CreatenativeQuery ("เลือก ID, ชื่อ, อายุจาก t_user", user.class);ควรสังเกตที่นี่ว่าการใช้แผนที่มีประสิทธิภาพน้อยกว่าการใช้อาร์เรย์วัตถุ ดังนั้นคุณต้องดูว่าการลดลงของประสิทธิภาพอยู่ในช่วงที่ยอมรับได้หรือไม่ จากนั้นในสภาพแวดล้อม Hibernate 4.2.x ของฉันไม่ว่าคุณจะเขียนตัวอักษรตัวใหญ่หรือตัวอักษรตัวพิมพ์เล็กใน SQL ดั้งเดิมของคุณชื่อฟิลด์ที่ส่งคืนจะถูกใช้เป็นตัวพิมพ์ใหญ่ แน่นอนคุณสามารถประมวลผลชื่อฟิลด์ด้วยวิธีใดวิธีหนึ่งโดยการปรับแต่ง ResultTransformer และแม้แต่ส่งคืน pojo ที่คุณต้องการ
วิธีการข้างต้นเพื่อให้อินเตอร์เฟสการสืบค้นแบบสอบถามของ JPA ส่งคืนวัตถุแผนที่เป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น