たとえば、従業員と住所の2つのエンティティがあります。これらのエンティティのうち、従業員には外部キーAddressIDがあり、AddressのID列を参照します。 Javaドメインオブジェクトでは、HibernateはForgeinキーの整数フィールドをAddressオブジェクトフィールドで適切にラップします。しかし、特定のAddressIDでEmployeeをクエリするにはどうすればよいでしょうか?
テーブルエイリアスを作成しようとしました。それはうまくいくようですが、それはかなり厄介です。
私も次のようなことをしようとしました:
criteria.add(restriction.eq("TheAddressObjectFieldName", 123);
しばらくは機能しますが、常に機能するとは限りません。これが正しい方法かどうかはわかりませんが、それがいつでもできることを望んでいました。
では、Hibernateで外部キー列を照会する正しい方法は何ですか?
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));
同様の問題があります... @ ChssPly76の回答は問題なく機能しますが、外部キーが親テーブルのIDの一部でない場合の解決策が見つかりました-「referencedColumnName」を追加して注釈を変更する必要があります。
@ManyToOne
@JoinColumn(name="address_id", referencedColumnName="addrUniqueFieldName")
private Address address;
次に、基準を作成できます。
criteria.add(restriction.eq("address.addrUniqueFieldName", 123);