如何在一个查询中完成所有这些操作?休眠状态

问题描述

| 我有一个Ids列表,我想在一个查询中返回所有行。作为对象列表(因此是产品列表或其他)。 我试过了
public List<TableA> MyMethod(List<string> keys)
{
    var query = \"SELECT * FROM TableA WHERE Keys IN (:keys)\";
    var a = session.createquery(query).SetParameter(\"keys\",keys).List();
   return a; // a is a IList but not of TableA. So what do I do Now?
}
但我不知道如何将其作为对象列表返回。这是正确的方法吗?

解决方法

List<TableA> result = session.CreateQuery(query)
                             .SetParameterList(\"keys\",keys)
                             .List<TableA>();
,但是,如果\“:keys \”的数量超过1000(如果oracle无法确定其他数据库的数量),则此查询中可能存在限制,因此我建议使用ICriteria代替CreateQuery-native sql。 做这样的事情
[TestFixture]
    public class ThousandIdsNHibernateQuery
    {
        [Test]
        public void TestThousandIdsNHibernateQuery()
        {
            //Keys contains 1000 ids not included here.
            var keys = new List<decimal>();

            using (ISession session = new Session())
            {
                var tableCirt = session.CreateCriteria(typeof(TableA));


                if (keys.Count > 1000)
                {
                    var listsList = new List<List<decimal>>();

                    //Get first 1000.
                    var first1000List = keys.GetRange(0,1000);

                    //Split next keys into 1000 chuncks.
                    for (int i = 1000; i < keys.Count; i++)
                    {
                        if ((i + 1)%1000 == 0)
                        {
                            var newList = new List<decimal>();
                            newList.AddRange(keys.GetRange(i - 999,1000));
                            listsList.Add(newList);
                        }

                    }

                    ICriterion firstExp = Expression.In(\"Key\",first1000List);
                    ICriterion postExp = null;

                    foreach (var list in listsList)
                    {
                        postExp = Expression.In(\"Key\",list);
                        tableCirt.Add(Expression.Or(firstExp,postExp));
                        firstExp = postExp;

                    }

                    tableCirt.Add(postExp);
                }
                else
                {
                    tableCirt.Add(Expression.In(\"key\",keys));

                }

                var results = tableCirt.List<TableA>();
            }

        }
    }