javax.persistence.Query.getResultList () สามารถคืนค่า null ได้หรือไม่


115

และถ้าเป็นเช่นนั้นภายใต้สถานการณ์ใด?

Javadoc และ JPA spec บอกว่าไม่มีอะไร


ฉันกำลังค้นหาคำถามนี้พอดี! TKS! ขึ้น 4 คุณ!
rafa.ferreira

คำตอบ:


69

คุณพูดถูก ข้อกำหนดของ JPA บอกว่าไม่มีอะไรเกี่ยวกับเรื่องนี้ แต่Java Persistence กับหนังสือ Hibernate ฉบับพิมพ์ครั้งที่ 2กล่าวว่า:

หากผลการสืบค้นว่างเปล่าระบบจะส่งคืนค่าว่าง

การใช้งาน Hibernate JPA (ตัวจัดการเอนทิตี) จะคืนค่า null เมื่อคุณเรียกใช้ query.getResultList () โดยไม่มีผลลัพธ์

UPDATE

ตามที่ผู้ใช้บางคนระบุไว้ดูเหมือนว่า Hibernate เวอร์ชันใหม่ล่าสุดจะส่งคืนรายการว่างแทน

รายการว่างจะถูกส่งคืนใน Eclipselink เช่นกันเมื่อไม่พบผลลัพธ์


29
สิ่งนี้ล้าสมัยอย่างแน่นอนไฮเบอร์เนตส่งคืนรายการว่างเปล่า
Michael Laffargue

2
ฉันยังคงได้รับโมฆะจาก Hibernate 4.3.10 (ทำงานเป็นเครื่องมือ JPA สำหรับ Spring Data) สิ่งนี้จะเกิดขึ้นกับข้อความค้นหาเนทีฟเพียงรายการเดียวเนื่องจากการค้นหา JPA ทั่วไปทำงานตามที่คาดไว้
Jacek Prucia

1
เพียงตรวจสอบเงื่อนไขทั้งสองโดยใช้หรือ if(rows == null || rows.size == 0){}โดยที่แถวคือสิ่งที่ getResultList () ส่งคืน
Number945

เพียงห่อไว้ใน Optional.ofNullable () เท่านี้ก็เสร็จเรียบร้อยแล้ว
de.la.ru

ฉันเชื่อว่าการกลับมาnullแทนที่จะเป็นรายการที่ว่างเปล่าไม่ใช่สิ่งที่สเป็คตั้งใจไว้เนื่องจากเป็นอย่างอื่นทำให้ชัดเจนว่าควรคาดหวังnullในที่อื่นเมื่อใด โดยเฉพาะอย่างยิ่งเป็นเอกสารสำหรับอ่านgetResultList Execute a SELECT query and return the query results as a(n) (un)typed List. - @return a list of the resultsฉันยังคงตรวจสอบnullแน่นอนและส่งคืนรายการว่างเปล่าด้วยตัวเองหากจำเป็น
René

23

หากสเปคบอกว่ามันไม่สามารถเกิดขึ้นได้คุณจะเชื่อไหม? เนื่องจากโค้ดของคุณสามารถทำงานร่วมกับการใช้งาน JPA ที่แตกต่างกันได้คุณจะไว้วางใจให้ผู้ใช้งานทุกคนทำให้ถูกต้องหรือไม่?

ไม่ว่าจะเป็นอย่างไรฉันจะตั้งรหัสป้องกันและตรวจสอบค่าว่าง

ตอนนี้คำถามใหญ่: เราควรถือว่า "null" และรายการว่างตรงกันหรือไม่? นี่คือสิ่งที่ข้อกำหนดควรช่วยเราและไม่ควรทำ

ฉันเดาว่าผลตอบแทนที่เป็นโมฆะ (หากเกิดขึ้นจริง) จะเทียบเท่ากับ "ฉันไม่เข้าใจคำค้นหา" และรายการว่างเปล่าจะเป็น "ใช่เข้าใจคำค้นหา แต่ไม่มีเรกคอร์ด"

คุณอาจมีเส้นทางรหัส (น่าจะเป็นข้อยกเว้น) ที่เกี่ยวข้องกับการสืบค้นที่ไม่สามารถแยกวิเคราะห์ได้ฉันมักจะกำหนดค่าว่างกลับลงมาในเส้นทางนั้น


+1 คุณพูดถูกเมื่อพูดว่า: "คุณจะเชื่อใจผู้ให้บริการ JPA ทุกรายหรือไม่" NO :)
dfa

แก้ไขเพื่อเพิ่ม: Arthur ได้ชี้ให้เห็นว่า JPA ของ Hibernate ส่งคืนค่าว่างหากไม่พบบันทึก ดังนั้นในกรณีนี้เราจำเป็นต้องพับรายการว่างและว่างเข้าด้วยกัน ฉันเชื่อว่ากระบวนการคิดที่เราดำเนินการข้างต้นยังคงใช้ได้ เป็นไปได้ว่าเราควรมีการรักษา null ที่แตกต่างกันสำหรับกอง JPA ที่แตกต่างกัน ยินดีต้อนรับสู่ความสนุกในการพกพา
djna

ตกลง มีเพียง "ความสนุกในการพกพา" เนื่องจาก JPA spec ไม่ได้ทำในสิ่งที่ควรทำ ... ระบุความหมายที่แม่นยำ ความอัปยศดำเนินการโดยคณะกรรมการที่มีส่วนได้เสีย
DataNucleus

2
"ฉันไม่เข้าใจข้อความค้นหา" ควรได้รับการจัดการเนื่องจากการExceptionส่งคืนnullตำแหน่งที่Collectionอยู่ในประเภทการส่งคืนเป็นข้อบกพร่องในการออกแบบที่เห็นได้ชัด
matoni

13

ตรงกันข้ามกับโพสต์ของ Arthur เมื่อฉันเรียกใช้แบบสอบถามที่ไม่มีเอนทิตีตรงกับฉันได้รายการว่างเปล่าไม่ใช่ค่าว่าง นี่คือการใช้ Hibernate และเป็นสิ่งที่ฉันคิดว่าเป็นพฤติกรรมที่ถูกต้อง: รายการว่างคือคำตอบที่ถูกต้องเมื่อคุณขอคอลเล็กชันของเอนทิตีและไม่มีเลย


2
สำหรับ OpenJPA ฉันยังได้รับรายการว่างแทนค่าว่าง
Gnavvy

3

หากคุณดูอย่างละเอียดที่org.hibernate.loader.Loader(4.1) คุณจะเห็นว่ารายการนั้นถูกเตรียมใช้งานภายในเมธอด processResultSet () ( doc , source ) เสมอ

protected List processResultSet(...) throws SQLException {
   final List results = new ArrayList();

   handleEmptyCollections( queryParameters.getCollectionKeys(), rs, session );
   ...
   return results;

}

ผมไม่คิดว่ามันจะกลับมาเป็นโมฆะในตอนนี้


2
ไชโยสำหรับข้อมูลโค้ดที่แน่นอน แต่คำตอบนี้มุ่งเน้นไปที่เพียงแค่จำศีลซึ่งเป็นหนึ่งในการดำเนินการตามข้อกำหนด การใช้งานอื่น ๆ เช่น OpenJPA แตกต่างกันในลักษณะการทำงาน นอกจากนี้การจำศีลดูเหมือนว่าจะมีการเปลี่ยนแปลงพฤติกรรมในเวอร์ชันต่างๆ
venky

1

แน่นอนว่าหากคุณทดสอบผลลัพธ์ที่กำหนดด้วย CollectionUtils.isNotEmpty ของจาการ์ตาคุณจะได้รับความคุ้มครองไม่ว่าจะด้วยวิธีใดก็ตาม


0

Query.getResultList()nullส่งกลับรายการที่ว่างเปล่าแทน ดังนั้นตรวจสอบisEmpty()ผลลัพธ์ที่ส่งคืนและดำเนินการต่อด้วยตรรกะที่เหลือหากเป็นเท็จ


0

เมื่อนำไปใช้getResultsList()ในorg.hibernate.ejb.QueryImplชั้นเรียนจึงสามารถส่งคืน a null:

public List getResultList() {
    try {
        return query.list();
    }
    catch (QueryExecutionRequestException he) {
        throw new IllegalStateException(he);
    }
    catch( TypeMismatchException e ) {
        throw new IllegalArgumentException(e);
    }
    catch (HibernateException he) {
        em.throwPersistenceException( he );
        return null;
    }

เวอร์ชันไฮเบอร์เนตของฉันคือ: 3.3.1.GA

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.