NHibernate كيفية تحديد كائنات مختلفة تعتمد على خاصية معينة باستخدام HQL؟

StackOverflow https://stackoverflow.com/questions/1800289

  •  05-07-2019
  •  | 
  •  

سؤال

وكيف يمكن استخدامها HQL لتحديد كائنات محددة تلبي معايير معينة؟

لقد حاولت التالية لإنشاء قائمة العشرة الأوائل يغذي مشتركين RSS (حيث SubscriptionCount هو الممتلكات المتأتية):

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss 
                                                 FROM RssFeedSubscription rss
                                                 group by rss.FeedUrl
                                                 order by rss.SubscriptionCount DESC
                                                 ")
.SetMaxResults(10)
.List<RssFeedSubscription>();

وعندما يكون القصد من ذلك هو فقط لتحديد اثنين من تغذية عناوين المواقع الفريدة في قاعدة البيانات، بدلا من الصفوف عشرة كثافة العمليات قاعدة البيانات مثيل ككائنات. ونتيجة ما سبق هو:

Column 'RssSubscriptions.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

ومن الممكن فقط أن رقيقة من نتائج ذلك أن نتخذ من اثنين من تغذية عناوين المواقع الفريدة بعد ان نحصل على البيانات مرة أخرى من قاعدة البيانات، ولكن يجب أن يكون هناك طريقة للقيام بذلك على مستوى DB باستخدام HQL؟

وتحرير: ونحن ندرك أنه من الممكن القيام استعلام عددي ثم يدويا بسحب القيم، ولكن ليس هناك وسيلة لمجرد تحديد معايير مباراة لسحب الأشياء الى الوراء

هل كانت مفيدة؟

المحلول

إذا قمت بتغيير HQL الخاص بك قليلا لتبدو وكأنها ما يلي:

var topTen = UoW.Session.CreateQuery( @"SELECT distinct rss.FeedUrl
                                          FROM RssFeedSubscription rss
                                          group by rss.FeedUrl
                                          order by rss.SubscriptionCount DESC
                                        ")
.SetMaxResults(10)
.List();

والمتغير topTen سيكون كائن [] مع 2 عناصر في وجود كونها تغذية عناوين المواقع (2).

هل يمكن أن يكون هذا عاد جمع كما كتبته بقوة إذا كنت تستخدم طريقة SetResultTransformer () من interfase IQuery.

نصائح أخرى

وتحتاج إلى تنفيذ استعلام القياسي. هنا مثال من مستندات NHibernate:

IEnumerable results = sess.Enumerable(
    "select cat.Color, min(cat.Birthdate), count(cat) from Cat cat " +
    "group by cat.Color"
);
foreach ( object[] row in results )
{
    Color type = (Color) row[0];
    DateTime oldest = (DateTime) row[1];
    int count = (int) row[2];
    .....
}

وانها group by rss.FeedUrl أن يسبب لك مشكلة. أنها لا تبدو وكأنها كنت في حاجة إليها منذ كنت اختيار الكيانات نفسها. إزالة ذلك، وأعتقد أن عليك أن تكون جيدة.

وتحرير - اعتذاري لم أتبين الجزء عن "الممتلكات المتأتية". وبحلول ذلك أفترض أنك يعني انها ليست خاصية تعيين السبات، وبالتالي لم يكن لديك فعلا عمود في الجدول؟ وهذا يفسر رسالة الخطأ الثاني الذي وردت في الاستعلام الخاص بك. قد تحتاج إلى إزالة "ترتيب حسب" شرط وكذلك القيام الفرز الخاص بك في جاوة إذا كان هذا هو الحال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top