2012-09-19 14 views
8

Mam 2 elementy/tabele hibernacji i trzeba połączyć informacje z obu do wykorzystania w widoku. Tabele sąNajlepszy sposób łączenia 2 tabel przy użyciu hibernacji

Istnieje relacja jeden-do-wielu między klientem a terminem, w oparciu o identyfikator klienta. W zwykłym SQLu powiedziałbym coś w rodzaju:

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

i użyć zwróconego zestawu rekordów.

Nie jestem pewien, jak to zrobić w hibernacji. Czy powinienem utworzyć encję ClientAppt, a następnie zrobić coś podobnego do powyższego select (zmodyfikowanego nieco dla HQL)?

Uwaga, pomyślałem o zastosowaniu podejścia SecondaryTable, ale myślę, że wymaga to związku 1 do 1? Przypuszczam, że mógłbym mapować jeden do wielu, ale czy istnieje alternatywa? To jest jednorazowa zmiana i odwzorowanie jednej do wielu relacji może być nieco kosztowne dla czegoś tak małego? Jakie jest najlepsze podejście? Dzięki

Odpowiedz

2

Można modelować na wiele sposobów. Chciałbym, aby Klient był Entity, a różne spotkania były zbiorem elementów. Nie określono języka, ale w Javie byłoby jak:

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

    .... 
}  

Następnie można pobrać klientów korzystających z dowolnej metody wolisz, z najprostszym samopoczucie:

session.get(Client.class, clientId); 

Hibernate zrobi łączenia i zwróć obiekt klienta z zestawem spotkań. Możesz dalej zrobić zestaw SortedSet lub dodać do niego indeks, aby stał się Listą.

+0

Dzięki, Sharakan. Myślę, że spróbuję tej metody i zobaczę, co się stanie. – Dave

+0

sharakan, próbowałem twojej metody, ale dostaję błąd. Opis jest tutaj - http: // stackoverflow.com/questions/12502850/class-not-mapped-exception-but-it-is-is-mapowany – Dave

+0

OK, od definicji terminu, w którym się znajdujesz (szczególnie, że masz identyfikator, którego nie znałem) , Myślę, że faktycznie chcesz Entity. Zaktualizuję moją odpowiedź. Nie mogę jednak komentować braku mapowania, nie wiem, jak konfiguruje się Glassfish. – sharakan

1

Powinieneś użyć Projections.alias, aby określić listę kolumn, które Cię interesują. Patrz na przykład instrukcja hibernacji: here.

0

Czy opisałeś swój kod za pomocą metadanych relacji? Jeśli tak, powinieneś być w stanie po prostu zapytać o listę klientów, a następnie uzyskać ich spotkania dostęp do pola, trzymając je.

4

"Najlepszym" sposobem (imho) nie jest myślenie o normalnym sposobie SQL. Nie myśl o wybraniu pewnych pól i są tabele, do których się przyłączasz. Powinieneś próbować tworzyć znaczące podmioty gospodarcze i powinieneś pracować nad tymi podmiotami gospodarczymi.

Na przykład, tutaj jest to, co chciałbym zrobić:

(nie rzeczywisty kod, po prostu pokazać ideę)

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

Z powyższego odwzorowania, co trzeba zrobić, to nic więcej niż HQL from Appointment a where a.client.id = :whatEverIdYouWant, lub, aby zapisać dodatkowe zapytanie do DB, from Appointment a join fetch a.client where a.client.id = :whatEverIdYouWant

Możesz także dodać mapowanie @ sharakan, jeśli Twój projekt nie ma nic przeciwko Klientowi w zależności od Powołanie

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

} 
Powiązane problemy