2012-09-19 10 views
8

का उपयोग करके 2 टेबल में शामिल होने का सबसे अच्छा तरीका मेरे पास 2 हाइबरनेट इकाइयां/टेबल हैं और इन्हें देखने के लिए दोनों से जानकारी एकत्र करने की आवश्यकता है। टेबलहाइबरनेट

Table Client: 
    clientId, 
    firstName, 
    lastName, 
    phone, 
    cellPhone 

Table Appointment: 
    apptTime, 
    clientId (and some other fields I don't need now) 

क्लाइंट आईडी के आधार पर ग्राहक और नियुक्ति के बीच एक से अधिक संबंध हैं। नियमित एसक्यूएल में मैं बस कुछ कहूंगा:

Select 
    client.clientId, 
    appt.apptTime, 
    client.firstName, 
    client.lastName 
from 
    Client client, 
    Appointment app 
where 
    client.clientId = appt.clientId 

और लौटाए गए रिकॉर्डसेट का उपयोग करें।

मुझे यकीन नहीं है कि हाइबरनेट में ऐसा कैसे करें। क्या मुझे क्लाइंटएपेट इकाई बनाना चाहिए और फिर उपर्युक्त चयन (एचक्यूएल के लिए कुछ हद तक संशोधित) की तरह कुछ करना चाहिए?

नोट, मैंने माध्यमिकटेबल दृष्टिकोण का उपयोग करने के बारे में सोचा, लेकिन मुझे लगता है कि 1 से 1 रिश्ते की आवश्यकता है? मुझे लगता है कि मैं कई लोगों को मैप कर सकता हूं, लेकिन क्या कोई विकल्प है? यह एक बार बदल गया है और कई रिश्ते में मैपिंग करना इस छोटे से कुछ के लिए थोड़ा महंगा हो सकता है? सबसे अच्छा तरीका क्या है? धन्यवाद

उत्तर

2

आप इन कई तरीकों से मॉडल कर सकते हैं। मैं क्या करूँगा क्लाइंट एक संस्था है, और विभिन्न नियुक्तियां तत्व संग्रह होनी चाहिए। आप भाषा निर्दिष्ट नहीं किया है, लेकिन जावा में ऐसा होगा:

@Entity 
@Table(name="person") 
public class ClientAppts { 
    ... 

    @OneToMany(mappedBy="client") 
    Set<Appointment> appointments; 
} 

@Entity 
@Table(name="person") 
public class Appointment { 
    .... 

    @ManyToOne 
    @JoinColumn(name="person_id") 
    private ClientAppts client; 

    .... 
}  

फिर आप ग्राहकों को जो कुछ भी आप अपनी पसंदीदा विधि का उपयोग कर प्राप्त कर सके, सरल किया जा रहा है के साथ:

session.get(Client.class, clientId); 

हाइबरनेट में शामिल होने के क्या करेंगे और नियुक्तियों के एक सेट के साथ एक ग्राहक वस्तु वापस। आप सेट को सॉर्टेडसेट सेट कर सकते हैं, या इसे सूची बनाने के लिए इसमें एक इंडेक्स जोड़ सकते हैं।

+0

धन्यवाद, शारकन। मुझे लगता है कि मैं इस विधि को आजमाउंगा और देखें कि क्या होता है। – Dave

+0

शारकन, मैंने आपकी विधि की कोशिश की लेकिन मुझे एक त्रुटि मिल रही है। विवरण यहां है - http: // stackoverflow।कॉम/प्रश्न/12502850/क्लास-मैप-अपवाद-लेकिन-यह-मैप किया गया है – Dave

+0

ठीक है, आपके पास नियुक्ति की परिभाषा से ठीक है (विशेष रूप से तथ्य यह है कि आपके पास एक आईडी है, जिसे मैं नहीं जानता था) , मुझे लगता है कि आप वास्तव में एक इकाई चाहते हैं। मैं अपना जवाब अपडेट करूंगा। मैं अनपेक्षित-नेस पर टिप्पणी नहीं कर सकता, हालांकि, मैं परिचित नहीं हूं कि ग्लासफ़िश कॉन्फ़िगरेशन कैसे करता है। – sharakan

1

आपको रुचि रखने वाले कॉलम की सूची निर्दिष्ट करने के लिए Projections.alias का उपयोग करना चाहिए। उदाहरण के लिए हाइबरनेट मैनुअल here देखें।

0

क्या आपने रिश्ते मेटाडेटा के साथ अपना कोड एनोटेट किया था? यदि आपने किया है तो आपको केवल ग्राहकों की सूची के लिए पूछताछ करने में सक्षम होना चाहिए और फिर उन्हें नियुक्ति के क्षेत्र में पहुंचने के लिए उनकी नियुक्तियां प्राप्त करनी चाहिए।

4

"सर्वश्रेष्ठ" तरीका (आईएमएचओ) सामान्य एसक्यूएल तरीके के बारे में सोचना नहीं है। कुछ फ़ील्ड चुनने के बारे में मत सोचो और आप जिन टेबलों में शामिल हो रहे हैं वे हैं। आपको सार्थक व्यावसायिक संस्थाएं बनाने की कोशिश करनी चाहिए और आपको उन व्यावसायिक संस्थाओं पर काम करना चाहिए।

उदाहरण के लिए, यहाँ मैं क्या कर देगी:

(वास्तविक नहीं कोड, बस पता चलता विचार)

@Entity 
public class Client { 
    @Id 
    @Column(name="clientId") 
    private Long id; 

    @Column 
    private String longName; 
} 

@Entity 
public class Appointment { 
    @Id 
    private Long id; 

    @ManyToOne 
    @Column(name="clientId") 
    private Client client; 
} 

ऊपर मानचित्रण के साथ, आप क्या करने की जरूरत कुछ भी नहीं एक से अधिक है HQL from Appointment a where a.client.id = :whatEverIdYouWant, या, डीबी करने के लिए अतिरिक्त क्वेरी को बचाने के लिए, from Appointment a join fetch a.client where a.client.id = :whatEverIdYouWant

यदि आपका डिजाइन नियुक्ति के आधार पर ग्राहकों का मन नहीं करता है तुम भी @ sharakan की मैपिंग जोड़ सकते हैं

0
public class Appoinment { 

@Override 
public List<Appointment > methodName(String search) { 
    String hql =" from Appointment a join fetch a.client where a.client.id = 
        :search"; 

    Query<Appointment > query=this.getSession().createQuery(hql,Appointment 
      .class); 
    Long id=-1L; 
    try { 
     id=Long.parseLong(search); 
    }catch (NumberFormatException ex) { 
     ex.printStackTrace(); 
    } 
    query.setParameter("id", id); 
    query.setParameter("search", "%" +search+ "%"); 
    return query.getResultList(); 
} 

}