2012-09-19 65 views
8

我有2個hibernate實體/表,並且需要將來自兩者的信息結合起來用於視圖。表格是使用休眠連接兩個表的最佳方法

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

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

客戶端和Appointment之間存在一個基於clientID的一對多關係。在常規的SQL中,我只是這樣說:

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

並使用返回的記錄集。

我不知道如何在Hibernate中做到這一點。我應該創建一個ClientAppt實體,然後執行類似上面的選擇(針對HQL進行某些修改)?

請注意,我想過使用SecondaryTable方法,但我認爲這需要1對1的關係?我想我可以映射一個到多個,但是有沒有其他選擇?這是一次性變化,映射一對多關係對於這麼小的事情可能有點貴? 什麼是最好的方法? 謝謝

回答

2

您可以通過多種方式進行建模。我要做的是讓客戶成爲一個實體,並且將各種約會作爲一個元素集合。您沒有指定的語言,但在Java它會像:

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

Hibernate會做加盟並用一組約會返回一個Client對象。你可以進一步使該集合成爲一個SortedSet,或者添加一個索引來使它成爲一個List。

+0

謝謝,sharakan。我想我會嘗試這種方法,看看會發生什麼。 – Dave

+0

sharakan,我試過你的方法,但我得到一個錯誤。描述在這裏 - http:// stackoverflow。com/questions/12502850/class-not-mapped-exception-but-it-is-mapped- – Dave

+0

好的,從你在那裏的約會定義(特別是你有一個ID,我不知道) ,我認爲你確實需要一個實體。我會更新我的答案。雖然我無法評論未映射,但我並不熟悉Glassfish如何配置。 – sharakan

1

您應該使用Projections.alias來指定您感興趣的列的列表。例如,請參閱休眠手冊here

0

您是否使用關係元數據註釋了您的代碼?如果你確實應該能夠簡單地查詢客戶列表,然後讓他們的約會訪問持有它們的字段。

4

「最佳」方式(imho)並不是想象正常的SQL方式。不要想到選擇某些領域,並且有你加入的表格。您應該嘗試創建有意義的業務實體,並且應該處理這些業務實體。

例如,這裏是我會做什麼:

(而不是實際的代碼,只是顯示的想法)

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

}