5

私は、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();
4

1 に答える 1

8

あなたの例に従うかどうかは完全にはわかりませんが、Criteriaオブジェクトをネストしてツリーを形成するだけで、関連付けられたエンティティにフィルター条件を指定することは確かに可能です。たとえば、 Userエンティティと多対1 のリレーションシップを持つOrderというエンティティがある場合、次のようなクエリを使用して、Fred という名前のユーザーのすべての注文を見つけることができます。

List<Order> orders = session.createCriteria(Order.class)
    .createCriteria("user")
        .add(eq("name", "fred"))
    .list();

それ自体と関係を持つエンティティについて話している場合は、それも同様に機能するはずです。関連オブジェクトの ID でフィルタリングする必要がある場合は、「name」を「id」に置き換えることもできます。

于 2009-08-14T19:04:28.203 に答える