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
上記のクエリは FoostartDate プロパティに等しい 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 のプロパティを使用することもできます。PersoncountrymedicareNumber から構成される複合 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" タイプは特別なプロパティ idclass を持ち、以下のように結合を記述できます (AuditLog.item<any> でマップされたプロパティです)。Any は Hibernate に固有です。
from AuditLog log, Payment payment 
where log.item.class = 'Payment' and log.item.id = payment.id
上記のクエリで、log.item.classpayment.class は完全に異なるデータベースカラムの値を参照することに注意してください。