10

我有 2 个休眠实体/表,需要结合两者的信息以在视图中使用。这些表是

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

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

基于 clientID,client 和 Appointment 之间存在一对多的关系。在常规 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 的关系?我想我可以映射一个一对多,但有其他选择吗?这是一次更改,映射一对多关系对于这么小的东西可能有点贵?最好的方法是什么?谢谢

4

5 回答 5

4

您可以通过多种方式对此进行建模。我要做的是让客户成为一个实体,并让各种约会成为一个元素集合。您没有指定语言,但在 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,或向其添加索引以使其成为列表。

于 2012-09-19T02:44:37.087 回答
4

“最佳”方式(恕我直言)是不要考虑正常的 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,或者,将额外的查询保存到 DB,from Appointment a join fetch a.client where a.client.id = :whatEverIdYouWant

如果您的设计不介意客户,您也可以添加@sharakan 的映射,具体取决于预约

于 2012-09-19T03:13:12.670 回答
1

您应该使用Projections.alias来指定您感兴趣的列列表。例如,请参见此处的休眠手册。

于 2012-09-19T02:36:56.593 回答
1
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();
}

}
于 2017-10-18T03:26:33.247 回答
0

您是否使用关系元数据注释您的代码?如果你这样做了,你应该能够简单地查询客户列表,然后让他们的约会访问持有他们的字段。

于 2012-09-19T02:39:22.237 回答