0

次の2つのクラスがあるとしましょう。ユーザーと場所。DetachedCriteriaを作成してユーザーテーブルをクエリし、「xyz」という名前の場所を持たないすべてのユーザーを返します。

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @CollectionOfElements
    Set<Location> locations;
}

@Entity
public class Location{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    @Column
    String name;
}

次のコードは、「xyz」という名前が設定された場所を持っているすべてのユーザーを返します。

DetachedCriteria dc = DetachedCriteria.forClass(User.class);
dc.createCriteria("locations")
     dc.add(Restrictions.eq("name", "xyz"));

制限.ne()に変更すると、実際に場所が設定されているユーザーのみが返されるため、機能しません。また、ユーザーに多数の場所が設定されている場合、そのユーザーは何度も複製されます。

何か案は?

4

2 に答える 2

1

元の投稿で説明されているように、エンティティUserLocationを使用します。

1) 関連付けられた場所が空かどうかを確認します。

Junction or = Restrictions.disjunction();
or.add(Restrictions.isEmpty("locations"));

2) LEFT_JOINと " ne " 制限で使用されるエイリアスを使用して、場所の関連基準を作成します。LEFT_JOIN が必要なため、場所の関係が空であってもUserレコードが返されます。

userCriteria.createCriteria("locations", "loc", Criteria.LEFT_JOIN);
or.add(Restrictions.ne("loc.name", "xyz"));

3) 論理和を元のユーザー基準に追加します。

userCriteria.add(or);
于 2012-03-09T00:04:48.880 に答える
0

おそらく、、、の組み合わせを使用して、逆論理を正しく機能させる必要Restrictions.and()がありRestrictions.not()ます。http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Restrictions.htmlを確認してください-間違いなく実行できます!Restrictions.or()Restrictions.in()

せいぜい1つしか取得できないようにするには、Userファクトリメソッド(http: //docs.jboss.org/hibernate/core/3.5/api/org/hibernate/criterion/Projections.html)-すなわち:DistinctProjections.distinct()

dc.setProjection(Projections.distinct(Projections.property("id")));

そのような何かがあなたが必要とすることをするはずです。

于 2011-05-25T00:26:27.643 に答える