2015-04-17 8 views
12

मेरे पास निम्नानुसार एक वर्ग है जिसे Hibernate का उपयोग करके डीबी से पुनर्प्राप्त करने की आवश्यकता है। समस्या यह है कि मेरी कक्षा में कई सदस्य हैं और उनमें से अधिकांश कक्षाएं हैं, मैं उन्हें कैसे प्राप्त कर सकता हूं?हाइबरनेट प्रक्षेपण का उपयोग कर एक जटिल वर्ग और उसके सदस्यों को कैसे पुनर्प्राप्त करें?

@Entity 
public class Student { 
    @Id 
    long id; 
    String name; 
    String fname; 
    @OneToMany 
    List<Course> courses; 
    @ManyToOne 
    Dealer dealer; 
    ... 
} 

@Entity 
public class Dealer { 
    @Id 
    long id; 
    String name; 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = "cr.dealer", cascade = CascadeType.ALL) 
    Set<Car> cars = new HashSet<Cars>(0); 
    .. 

} 

मुझे छात्र आईडी 1 और उसके सभी पाठ्यक्रम, इसके डीलर और डीलरों की कारों की सूची पुनर्प्राप्त करने की आवश्यकता है।

मेरा प्रक्षेपण निम्नानुसार है लेकिन यह कुछ भी वापस नहीं करता है।

... 
    .setProjection(Projections.projectionList() 

    .add(Projections.property("friends.cars").as("cars") 
    ... 

उत्तर

1

क्योंकि आप पाठ्यक्रम की एक सूची और कार का एक सेट है, तो आप बस एक क्वेरी में पूरे ग्राफ लाने कर सकते हैं:

select s 
from Student s 
left join fetch s.courses 
left join fetch s.dealer d 
left join fetch d.cars 
where s.id = :id 

क्योंकि आप दो संग्रह फ़ेच कर रहे हैं, यह क्वेरी कार्टेशियन उत्पाद उत्पन्न करेगी, इसलिए आपको यह सुनिश्चित करना होगा कि चयनित बच्चों के संग्रह में बहुत अधिक प्रविष्टियां न हों।

आप डॉन अगर किसी ऐसे कार्तीय उत्पाद में चलाना चाहते हैं, तो आप बस इस क्वेरी चला सकते हैं: एक अलग क्वेरी के साथ कि संग्रह लाने के लिए

select s 
from Student s 
left join fetch s.courses 
left join fetch s.dealer d 
where s.id = :id 

और फिर आप dealer.cars का उपयोग:

Student s = ...; 
s.getDealer().getCars().size(); 
+0

आपके उत्तर के लिए धन्यवाद, क्या आप कृपया मेरे प्रश्न पर एक नज़र डालेंगे http://stackoverflow.com/questions/29980421/how-to-retireve-a-set-member-objects-using-hibernate – Jack

0

यदि उच्च प्रदर्शन कोई चिंता नहीं है, तो आपको हाइबरनेट को अपना काम करने देना चाहिए। बस आप इकाइयों के प्राप्तकर्ताओं का उपयोग करें। उदाहरण के लिए:

Student student1 = session.get(Student.class, 1L); 
List<Course> courses = student1.getCourses(); 
Dealer dealer = student1.getDealer(); 
Set<Car> cars = dealer.getCars(); 
+1

धन्यवाद लेकिन उच्च प्रदर्शन पर विचार किया जाना चाहिए। – Jack

4
// Projection is not needed, Hibernate will load child values as shown below 

    Student student = session.get(Student.class); 
    List<Course> courses = student.getCourses(); 
    Dealer dealer = student.getDealer(); 

    // If u want records only where child records are present, u can use LEFT_OUTER_JOIN 

    Criteria criteria = getHibernateSession().createCriteria(Student.class); 
    criteria.createAlias("Course", "Course", JoinType.LEFT_OUTER_JOIN); 

    // If u want to use Projections for performance, u have to add each and every column in projection 

    Criteria criteria = getHibernateSession().createCriteria(A.class); 
    criteria.createAlias("b", "b", JoinType.INNER_JOIN); 
    criteria.createAlias("b.r", "b.r", JoinType.INNER_JOIN); 
    criteria.createAlias("b.c", "b.c", JoinType.LEFT_OUTER_JOIN); 
    ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.groupProperty("column1")); 
    projectionList.add(Projections.property("column2")); 
    projectionList.add(Projections.property("column3")); 
    criteria.setProjection(projectionList); 
    criteria.setResultTransformer(Transformers.aliasToBean(Table.class)); 
+0

आपके उत्तर के लिए धन्यवाद , मेरे पास इसके साथ एक नया मुद्दा है और उस मुद्दे के लिए नया प्रश्न पोस्ट किया है, कृपया एक नज़र डालें, http://stackoverflow.com/questions/29980421/how-to-retireve-a-set-list-of-member-objects उपयोग करना-हाइबरनेट – Jack

0

मुझे यकीन है कि अगर आप QueryOver उपयोग कर सकते हैं, लेकिन यह कार्य इस तरह के लिए बहुत आसान होगा नहीं हूँ।

Student student = null; 
Dealer dealer = null; 
Course course = null; 
Car car = null; 

var myStudent = Session.QueryOver<Student>(() => student) 
.Left.JoinQueryOver(() => student.courses,() => courses) 
.Left.JoinQueryOver(() => student.dealer,() => dealer) 
.Left.JoinQueryOver(() => dealer.cars,() => car) 
.SelectList(list => list 
    .Select(() => student.Name) 
    .Select(() => student.Age) 
    .Select(() => courses.Description) 
    .Select(() => dealer.locaiton) 
    .Select(() => car.Model)) 
    .TransformUsing(Transformers.AliasToBean<StudentModel>()) 
    .List<StudentModel>().AsQueryable(); 

परिणाम प्राप्त करने के लिए छात्र मॉडल डीटीओ बनाएं। यह शुरू करने के लिए सिर्फ एक संकेत है, आप इसे अपनी आवश्यकता के हिसाब से संशोधित कर सकते हैं। मुझे उम्मीद है कि यह काम करेगा। :)

संबंधित मुद्दे