Red Hat Training
A Red Hat training course is available for Red Hat JBoss Web Server
8.7. where 句
where
句を使用すると、返されたインスタンスのリストの範囲を狭めることができます。エイリアスが存在しない場合は、名前でプロパティを参照できます。
select cat from Cat cat where cat.name='Fritz'
上記のクエリは 'Fritz' という名前の
Cat
のインスタンスを返します。
select foo from Foo foo, Bar bar where foo.startDate = bar.date
上記のクエリは
Foo
の startDate
プロパティに等しい date
プロパティを持つ bar
のインスタンスが存在する Foo
のすべてのインスタンスを返します。複合パス式により、where
句は非常に強力になります。以下のことに留意してください。
select cat from Cat cat where cat.mate.name is not null
このクエリは、テーブル (内部) 結合を持つ SQL クエリに変換されます。以下のように記述すると、
select foo from Foo foo where foo.bar.baz.customer.address.city is not null
SQL で 4 つのテーブル結合が必要になります。
=
演算子はプロパティだけでなくインスタンスも比較するために使用できます。
select cat, rival from Cat cat, Cat rival where cat.mate = rival.mate
select cat, mate from Cat cat, Cat mate where cat.mate = mate
特殊なプロパティ (小文字)
id
はオブジェクトの一意の ID を参照するために使用できます (また、マップされた ID プロパティ名を使用することもできます)。このキーワードは HQL に固有であることに注意してください。
select cat from Cat as cat where cat.id = 123 select cat from Cat as cat where cat.mate.id = 69
2 つ目のクエリは効率的です。テーブル結合は必要ありません。
複合 ID のプロパティを使用することもできます。
Person
が country
と medicareNumber
から構成される複合 ID を持つとします。
select person from bank.Person person where person.id.country = 'AU' and person.id.medicareNumber = 123456
select account from bank.Account account where account.owner.id.country = 'AU' and account.owner.id.medicareNumber = 123456
この場合も 2 つ目のクエリはテーブル結合を必要としません。
同様に、特別なプロパティ
class
はポリモーフィック永続化の場合にインスタンスの判別子値にアクセスします。where 句に組み込まれた Java クラス名はその判別子値に変換されます。これは HQL に固有です。
select cat from Cat cat where cat.class = DomesticCat
また、コンポーネントまたは複合ユーザータイプ (およびコンポーネントのコンポーネントなど) のプロパティを指定することもできます。コンポーネントタイプのプロパティで終了するパス式は使用しないでください (コンポーネントのプロパティとは逆になります)。たとえば、
store.owner
がコンポーネント address
を持つエンティティである場合は、以下のようになります。
store.owner.address.city // okay store.owner.address // error!
"any" タイプは特別なプロパティ
id
と class
を持ち、以下のように結合を記述できます (AuditLog.item
は <any>
でマップされたプロパティです)。Any
は Hibernate に固有です。
from AuditLog log, Payment payment where log.item.class = 'Payment' and log.item.id = payment.id
上記のクエリで、
log.item.class
と payment.class
は完全に異なるデータベースカラムの値を参照することに注意してください。