0

私は NHibernate を使用しています。私の要件は、ユーザーとチケットの 2 つのテーブルがあることです。User にあるが Ticket にはないすべてのレコードが必要です。Ticket テーブルには、User テーブルの主キー ID への参照キーとして UserId があります。以下は私のコードです、

 RegNotTickTemplate.Criteria = DetachedCriteria.For(typeof(User));
            RegNotTickTemplate.Criteria.Add(Subqueries.PropertyNotIn("ID",DetachedCriteria.For(typeof(Ticket))
                .SetProjection(Projections.Property("UserID"))));

上記のクエリは、正しいレコード セットを返しません。

4

2 に答える 2

0

あなたが見逃しているのは、このユーザーのチケット数はゼロより大きくなければならないということです。これを実装する方法は次のとおりです。

RegNotTickTemplate.Criteria = DetachedCriteria.For(typeof(User));
RegNotTickTemplate.Criteria.Add(Subqueries.PropertyIn("Id",
          DetachedCriteria.For<Ticket>()
            .SetProjection(Projections.GroupProperty("User"))
            .Add(Restrictions.Eq(Projections.RowCount(), 0))));

行数が必要ない場合は、次のようにします。

RegNotTickTemplate.Criteria = DetachedCriteria.For(typeof(User),"user");
RegNotTickTemplate.Criteria.Add(Subqueries.Exists(DetachedCriteria.For<Ticket>("ticket")
            .SetProjection(Projections.Property("User"))
            .Add(Restrictions.EqProperty("user.Id", "User"))));
于 2012-06-27T06:55:11.467 に答える
0

別の方法として、HQL を使用することもできます。HQLの方が読みやすいので、基準を使用しません(テーブルではなくエンティティに基づいてクエリを実行できることを除けば、SQLとほぼ同じです)。

第13章 HQL: Hibernate クエリ言語

IQuery query = Session.CreateQuery(
       "from User where Id not in (select UserId from Ticket)");
       query.List<User>();

それでもダメなら、いつでも SQL クエリを実行できます

ISQLQuery query = Session.CreateSQLQuery(sql);
于 2010-12-15T21:06:35.053 に答える