سؤال

في SQL يمكن للمرء أن كتابة استعلام الذي يبحث عن اسم لشخص مثل هذا:

SELECT * FROM Person P WHERE P.Name LIKE N'%ike%'

وهذا من شأنه أن الاستعلام تشغيل مع أحرف يونيكود (على افتراض أن العمود اسم قاعدة البيانات وكان الإعداد للتعامل مع دعم يونيكود).

وعندي استفسار مماثل في HQL التي يتم تشغيلها بواسطة السبات (NHibernate). الاستعلام ولدت يشبه:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%'  )

ولسوء الحظ، وضع 'N' أمام الحرفي في نتائج HQL في خطأ. لقد حاولت الهروب من أحرف Unicode في سلسلة وحتى الآن أي نجاح.

وقاعدة البيانات هو قبول والادخار أحرف يونيكود من السبات. لقد كنت قادرا على ملء بنجاح كائن مع سلسلة يونيكود، حفظه مع السبات، والتحقق من ذلك في قاعدة البيانات. ويبدو لي بأنه غريب القليل الذي لا يمكنني استخدام سلاسل يونيكود في استعلامات مخصصة (أو أفترض أيضا الاستفسارات اسمه).

هل هذه مشكلة معروفة أو الحد من السبات (Nhibernate)؟ كيف تستخدم الشفرة في HQL؟

وتشير

والعديد من المواقع التي تستخدم الاستعلامات معايير. ونظرا لضيق في الإطار الذي أعمل فيه، لم يكن ذلك ممكنا.

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

المحلول

ولقد حاولت مع المعلمات:

IList<Person> people = session
    .CreateQuery("from Person p where p.Name like :name")
    .SetParameter("name", "%カタカ%")
    .List<Person>();

وكما أن لديها ميزة لحماية إلكترونية ضد حقن SQL.

نصائح أخرى

ولقد وجدت الحل الذي يعمل. أشك بشدة هو الحل الأفضل. غير أنه الحل الذي أنا ذاهب لتنفيذ حتى أستطيع أن يأذن كتابة من قسم بناء الاستعلام بالكامل من البرنامج الذي أعمل على.

في المقام:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%')

وجملة WHERE يحتوي هذا الحرفي:

'%カタカ%'

وهذا الحرفي يمكن تقسيمها إلى nchars التي السبات (Nhibernate) سوف تمر من خلال تدري إلى SQL التي يولدها. الغريب، لكنه يعمل. وهكذا الاستعلام السابق يمكن أن تكون مكتوبة على النحو التالي:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%' + nchar(0x30AB) + nchar(0x30BF) + nchar(0x30AB)+ '%')

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

وهذه المشكلة تنشأ بسبب NHibernate يحاول الوصول إلى العمود دون طول نوع. وبالتالي في HBM.xml من المهم جدا أن نذكر طول تراث قواعد البيانات وإلا فإنه سوف تفشل ليونيكود الاشياء ذات الصلة.

وشكرا، ثاني

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