2012-09-19 52 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(); 
} 

}