web-dev-qa-db-ja.com

HibernateがIDで外部キーフィールドをクエリする

たとえば、従業員と住所の2つのエンティティがあります。これらのエンティティのうち、従業員には外部キーAddressIDがあり、AddressのID列を参照します。 Javaドメインオブジェクトでは、HibernateはForgeinキーの整数フィールドをAddressオブジェクトフィールドで適切にラップします。しかし、特定のAddressIDでEmployeeをクエリするにはどうすればよいでしょうか?

テーブルエイリアスを作成しようとしました。それはうまくいくようですが、それはかなり厄介です。

私も次のようなことをしようとしました:

criteria.add(restriction.eq("TheAddressObjectFieldName", 123);

しばらくは機能しますが、常に機能するとは限りません。これが正しい方法かどうかはわかりませんが、それがいつでもできることを望んでいました。

では、Hibernateで外部キー列を照会する正しい方法は何ですか?

40
savanna

Hibernateは、ラップするように指示したものだけを「うまくラップ」します。したがって、Employeeマッピングが次のようになっていると仮定します。

@Entity
public class Employee {
  ...
  @ManyToOne
  @JoinColumn(name="address_id")
  private Address address;
  ...
}

Addressにはidプロパティがあり、address_idに基づいてクエリを実行できます。

session.createCriteria(Employee.class)
 .add(Restrictions.eq("address.id", addressId));

Addressプロパティに基づいてクエリを実行するには、 エイリアスまたはネストされた基準を作成 する必要があります。

session.createCriteria(Employee.class)
 .createAlias("address", "a")
 .add(Restrictions.eq("a.postalCode", postalCode));
74
ChssPly76

同様の問題があります... @ ChssPly76の回答は問題なく機能しますが、外部キーが親テーブルのIDの一部でない場合の解決策が見つかりました-「referencedColumnName」を追加して注釈を変更する必要があります。

@ManyToOne
@JoinColumn(name="address_id", referencedColumnName="addrUniqueFieldName")
private Address address;

次に、基準を作成できます。

criteria.add(restriction.eq("address.addrUniqueFieldName", 123);
5
Helija