Hibernate の Criteria API はまだネストされた関係をサポートしていませんか?
-
16-09-2019 - |
質問
私は Hibernate の Criteria API を、おそらく最も可能性の高いユースケースであると誰もが言う、複雑な検索条件を適用するために使用したいと考えています。問題は、クエリを実行したいテーブルの全体がプリミティブ値で構成されているのではなく、部分的に他のオブジェクトから構成されており、それらのオブジェクトの ID に対してクエリを実行する必要があることです。
見つけました この記事 2年前からそれは不可能であることを示唆しています。これが私がそれを試してみて無駄だった方法です。Hibernate の別の側面では、オブジェクトのネストを示すために文字列リテラル内でこの種のドット表記がサポートされている場所を知っています。
if (!lookupBean.getCompanyInput().equals("")) {
criteria.add(Restrictions.like("company.company", lookupBean.getCompanyInput() + "%"));
}
編集:
これは、以下の最初の回答の提案を使用して、上記で試行していたことを達成するための正しく因数分解されたコードです。追加の createCriteria 呼び出しを使用して、さらに別の関連付けられたオブジェクト/テーブルの属性を順序付けしていることに注意してください。
if (!lookupBean.getCompanyValue().equals("")) {
criteria.createCriteria("company").add(
Restrictions.like("company", lookupBean.getCompanyValue() + "%"));
}
List<TrailerDetail> tdList =
criteria.createCriteria("location").addOrder(Order.asc("location")).list();
解決
あなたの例に従っているかどうかは完全にはわかりませんが、単純にネストするだけで、関連するエンティティにフィルター条件を指定することは確かに可能です。 基準 ツリーを形成するオブジェクト。たとえば、というエンティティがあるとします。 注文 との多対 1 の関係 ユーザー エンティティを使用すると、次のようなクエリを使用して、Fred という名前のユーザーのすべての注文を見つけることができます。
List<Order> orders = session.createCriteria(Order.class)
.createCriteria("user")
.add(eq("name", "fred"))
.list();
それ自体と関係があるエンティティについて話している場合、それも同様に機能するはずです。関連付けられたオブジェクトの ID でフィルターする必要がある場合は、「name」を「id」に置き換えることもできます。