15.9. where 節
where
節は返されるインスタンスのリストを絞ることができます。もし別名がない場合、名前でプロパティを参照することができます。
from Cat where name='Fritz'
別名がある場合、修飾名を使ってください:
from Cat as 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
節を非常に強力にします。以下を考えてみましょう:
from Cat cat where cat.mate.name is not null
このクエリはテーブル(内部)結合を持つ SQL クエリに変換されます。例:
from Foo foo where foo.bar.baz.customer.address.city is not null
上のクエリを記述したらクエリ内に4つのテーブル結合を必要とする SQL に変換されます。
=
演算子は以下のように、プロパティだけでなくインスタンスを比較するためにも使われます:
from Cat cat, Cat rival where cat.mate = rival.mate
select cat, mate from Cat cat, Cat mate where cat.mate = mate
id
(小文字) は特別なプロパティであり、オブジェクトの一意の識別子を参照するために使用できます。詳細については 「識別子プロパティの参照」 を参照ください。
from Cat as cat where cat.id = 123 from Cat as cat where cat.mate.id = 69
2番目のクエリは効率的で、テーブル結合が必要ありません。
また複合識別子のプロパティも使用できます。ここで
Person
が country
と medicareNumber
からなる複合識別子を持つと仮定します。
from bank.Person person where person.id.country = 'AU' and person.id.medicareNumber = 123456
from bank.Account account where account.owner.id.country = 'AU' and account.owner.id.medicareNumber = 123456
繰り返しますが、2番目のクエリにはテーブル結合が必要ありません.
識別子のプロパティ参照に関するさらなる情報については、「識別子プロパティの参照」 を参照してください。
class
は特別なプロパティであり、ポリモーフィックな永続化におけるインスタンスの 弁別子値にアクセスします。where 節に埋め込まれた Java のクラス名はその弁別子値に変換されます。
from Cat cat where cat.class = DomesticCat
またコンポーネントや複合ユーザー型、又はそのコンポーネントのプロパティも使用できます。詳細については、「コンポーネント」 を参照下さい。
"any" 型は特別なプロパティである
id
と class
を持ち、以下の方法で結合を表現することを可能にします (AuditLog.item
が <any>
でマッピングされたプロパティの場合)。
from AuditLog log, Payment payment where log.item.class = 'Payment' and log.item.id = payment.id
log.item.class
と payment.class
が上記のクエリで全く異なるデータベースカラムの値を参照します。