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 の間には 1 対多の関係があります。通常の 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 の関係が必要だと思いますか? 1対多をマッピングできると思いますが、代替手段はありますか? これは 1 回限りの変更であり、1 対多の関係をマッピングすると、このような小さなものには少しコストがかかる可能性があります。最善のアプローチは何ですか?ありがとう

4

5 に答える 5

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

上記のマッピングでは、行う必要があるのは HQLfrom 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 に答える
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 に答える
1

関心のある列のリストを指定するために使用する必要があります。たとえば、ここProjections.aliasで休止状態のマニュアルを参照してください。

于 2012-09-19T02:36:56.593 に答える
0

リレーションシップ メタデータでコードに注釈を付けましたか? そうした場合は、クライアントのリストを照会するだけで、クライアントを保持しているフィールドにアクセスする予定を取得できます。

于 2012-09-19T02:39:22.237 に答える