私が取り組んでいるプロジェクトでは、次の問題があります。システム内の各トランザクションは、特定のユーザーに割り当てられます。トランザクションおよびユーザークラス間の多対1のマッピングがあるように私はNHibernateはこれらのエンティティをマッピングしたnhibernateで最も一般的に使用されるmany-to-oneを照会する方法
public class User
{
public int ID { get; private set; }
public string FirstName { get; set; }
....
}
public class Transaction
{
public int ID { get; private set; }
public User CreatedBy { get; private set; }
...
}
:だから、そうのようなトランザクションとユーザー間の一対多の関係が、そこにあります。 Userオブジェクトにはトランザクションのリストはありませんが、Transactionにはそのトランザクションを作成したユーザーへの参照があります。
今ほとんどのトランザクションを作成したユーザーのリストを取得するためにクエリを実行したいが、NHibernateを使って上位10人の参照ユーザーを取得する方法がわからない。
アイデア?私はICriteriaを使用してHQLではなくこれを完成させたいと考えていますが、必要であればHQLもOKです。
更新
私は
GetSession().CreateCriteria(typeof (User))
.Add(Subqueries.PropertyIn("Id", topReferencedUsers))
.List<User>();
...
DetachedCriteria topReferencedUsers = DetatchedCriteria.For(typeof(Transaction))
.SetProjection(Projections.GroupProperty("CreatedBy.Id"))
.SetProjection(Projections.Count("CreatedBy.Id").As("pcount"))
.AddOrder(Order.Desc("pcount"))
.SetMaxResults(10);
とサブクエリとしてそれを構築する...などのクエリとシロッコの提案を試みたが、このサブクエリはしていませんトランザクションの合計数を返します。これらのトランザクションは、UserクエリーのIN句として使用されます。両方の投影でProjectionList()を追加すると、必要なサブクエリの出力が得られますが、2つの列の出力をUserクエリーのIN句に実行しようとするため失敗します。 NHibernateにIDとCountの両方を投影するにはどうすればいいのですか?
アップデート(2)
私はシロッコのSqlGroupProjectionの提案を試してみました(あなたのシロッコに感謝)が、空を思いつきました。最初に、プロパティpcountが見つかりませんでしたというエラーが表示されました。これは、注文を削除する必要があることを意味しました。つまり、タイムスタンプで注文していました。しかし、それでも、Usersテーブルに参加するユーザーIDではなく、ユーザーが参照された回数だけが出力されます。何か案は?ありがとう。
こんにちは、私は私の投稿を削除しました。 nhibernateユーザグループに質問すると、http://groups.google.com/group/nhusers?pli=1にもっと多くの運が必要です。あなたは答えがあるときにここに投稿してください、私は自分自身が不思議です。 また、賞金を払うこともできます。 – sirrocco