และถ้าเป็นเช่นนั้นภายใต้สถานการณ์ใด?
Javadoc และ JPA spec บอกว่าไม่มีอะไร
และถ้าเป็นเช่นนั้นภายใต้สถานการณ์ใด?
Javadoc และ JPA spec บอกว่าไม่มีอะไร
คำตอบ:
คุณพูดถูก ข้อกำหนดของ JPA บอกว่าไม่มีอะไรเกี่ยวกับเรื่องนี้ แต่Java Persistence กับหนังสือ Hibernate ฉบับพิมพ์ครั้งที่ 2กล่าวว่า:
หากผลการสืบค้นว่างเปล่าระบบจะส่งคืนค่าว่าง
การใช้งาน Hibernate JPA (ตัวจัดการเอนทิตี) จะคืนค่า null เมื่อคุณเรียกใช้ query.getResultList () โดยไม่มีผลลัพธ์
UPDATE
ตามที่ผู้ใช้บางคนระบุไว้ดูเหมือนว่า Hibernate เวอร์ชันใหม่ล่าสุดจะส่งคืนรายการว่างแทน
รายการว่างจะถูกส่งคืนใน Eclipselink เช่นกันเมื่อไม่พบผลลัพธ์
if(rows == null || rows.size == 0){}
โดยที่แถวคือสิ่งที่ getResultList () ส่งคืน
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
แน่นอนและส่งคืนรายการว่างเปล่าด้วยตัวเองหากจำเป็น
หากสเปคบอกว่ามันไม่สามารถเกิดขึ้นได้คุณจะเชื่อไหม? เนื่องจากโค้ดของคุณสามารถทำงานร่วมกับการใช้งาน JPA ที่แตกต่างกันได้คุณจะไว้วางใจให้ผู้ใช้งานทุกคนทำให้ถูกต้องหรือไม่?
ไม่ว่าจะเป็นอย่างไรฉันจะตั้งรหัสป้องกันและตรวจสอบค่าว่าง
ตอนนี้คำถามใหญ่: เราควรถือว่า "null" และรายการว่างตรงกันหรือไม่? นี่คือสิ่งที่ข้อกำหนดควรช่วยเราและไม่ควรทำ
ฉันเดาว่าผลตอบแทนที่เป็นโมฆะ (หากเกิดขึ้นจริง) จะเทียบเท่ากับ "ฉันไม่เข้าใจคำค้นหา" และรายการว่างเปล่าจะเป็น "ใช่เข้าใจคำค้นหา แต่ไม่มีเรกคอร์ด"
คุณอาจมีเส้นทางรหัส (น่าจะเป็นข้อยกเว้น) ที่เกี่ยวข้องกับการสืบค้นที่ไม่สามารถแยกวิเคราะห์ได้ฉันมักจะกำหนดค่าว่างกลับลงมาในเส้นทางนั้น
Exception
ส่งคืนnull
ตำแหน่งที่Collection
อยู่ในประเภทการส่งคืนเป็นข้อบกพร่องในการออกแบบที่เห็นได้ชัด
ตรงกันข้ามกับโพสต์ของ Arthur เมื่อฉันเรียกใช้แบบสอบถามที่ไม่มีเอนทิตีตรงกับฉันได้รายการว่างเปล่าไม่ใช่ค่าว่าง นี่คือการใช้ Hibernate และเป็นสิ่งที่ฉันคิดว่าเป็นพฤติกรรมที่ถูกต้อง: รายการว่างคือคำตอบที่ถูกต้องเมื่อคุณขอคอลเล็กชันของเอนทิตีและไม่มีเลย
หากคุณดูอย่างละเอียดที่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;
}
ผมไม่คิดว่ามันจะกลับมาเป็นโมฆะในตอนนี้
แน่นอนว่าหากคุณทดสอบผลลัพธ์ที่กำหนดด้วย CollectionUtils.isNotEmpty ของจาการ์ตาคุณจะได้รับความคุ้มครองไม่ว่าจะด้วยวิธีใดก็ตาม
Query.getResultList()
null
ส่งกลับรายการที่ว่างเปล่าแทน ดังนั้นตรวจสอบisEmpty()
ผลลัพธ์ที่ส่งคืนและดำเนินการต่อด้วยตรรกะที่เหลือหากเป็นเท็จ
เมื่อนำไปใช้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