2012-09-19 23 views
8

2 hazırda bekletme varlıkları/tablolarım var ve bilgileri bir görünümde kullanmak için her ikisinden de birleştirmem gerekiyor. Tablolar, istemci kimliği temelinde, müşteri ile Randevu arasında bire çok ilişki vardır. Düzenli SQL'de şöyle bir şey söyleyebilirim:Hazırda bekletme modunu kullanarak 2 tabloya katılmanın en iyi yolu

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

ve geri gönderilen kayıt kümesini kullanın.

Bunu nasıl hazırda bekletmediğimi bilmiyorum. Bir ClientAppt varlığı oluşturmalı ve sonra yukarıdaki gibi bir şey yapmalı mıyım (HQL için biraz değiştirilmiş)?

Not, İkincilTablo yaklaşımını kullanmayı düşündüm, ancak bunun 1 ile 1 arası bir ilişki gerektirdiğini düşünüyorum. Sanırım bir tane ile bir harita çizebilirim, ama bir alternatif var mı? Bu bir zaman değişimidir ve bire bir ilişkiyi haritalamak bu küçük bir şey için biraz pahalı olabilir mi? En iyi yaklaşım nedir? Teşekkürler

cevap

2

Bu çok yolu modelleyebilirsiniz. Yapacağım şey, Müşterinin bir Varlık olması ve çeşitli atamaların bir öğe koleksiyonu olması. Sen dili belirtmek yoktu, ama gibi Java olurdu:

session.get(Client.class, clientId); 

hazırda katılmak yapacağız:

@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; 

    .... 
}  

Daha sonra en basit varlık ile, ne olursa olsun tercih yöntemi kullanarak Müşteriler getirebilir ve bir Müşteri nesnesini bir dizi randevu ile birlikte iade edin. Daha sonra kümeyi bir SortedSet haline getirebilir veya bir Liste haline getirmek için bir indeks ekleyebilirsiniz.

+0

Teşekkürler, sharakan. Sanırım bu yöntemi deneyeceğim ve ne olduğunu göreceğim. – Dave

+0

sharakan, Yönteminizi denedim ancak bir hata alıyorum. Açıklama burada - http: // stackoverflow.com/questions/12502850/class-not-mapped-exception-ama-it-olduğunu-mapped – Dave

+0

Tamam, orada bulunan Randevu tanımından (özellikle farkında olduğum bir kimliğiniz var, aslında) Sanırım aslında bir varlık istiyorsun. Cevabımı güncelleyeceğim. Unmapped-ness hakkında yorum yapamam, Glassfish'in konfigürasyonu nasıl yaptıklarını bilmiyorum. – sharakan

1

İlgilendiğiniz sütunların listesini belirtmek için Projections.alias kullanmalısınız. Örneğin here hazırda bekletme kılavuzuna bakın.

0

Kodunuzu ilişki meta verileriyle eklediniz mi? Eğer yapmış olsaydınız, sadece müşteri listesini sorgulayabilmeli ve randevularını alanlarını tutan alana erişebilmelisiniz.

4

"En iyi" yol (imho) normal SQL yolunu düşünmüyor. Belirli alanları seçmeyi düşünmeyin ve katıldığınız tablolar var. Anlamlı iş varlıkları yapmaya çalışmalı ve o işletme varlıkları üzerinde çalışmalısınız. Örneğin

, burada ne yapardım geçerli: Yukarıdaki haritalanmasıyla

@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; 
} 

(fikir, gerçek değil kodu sadece göster)

, yapmanız gerekenleri hiçbir şey daha fazlasıdır HQL from Appointment a where a.client.id = :whatEverIdYouWant ya, tasarım Atama bağlı Client sakıncası yoksa from Appointment a join fetch a.client where a.client.id = :whatEverIdYouWant

Ayrıca @ sharakan en eşleme ekleyebilir, DB ekstra sorguyu kaydetmek için

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(); 
} 

} 
İlgili konular