سؤال

أنا أستخدم Hibernate for ORM لتطبيق Java الخاص بي إلى قاعدة بيانات Oracle (لا يهم بائع قاعدة البيانات، فقد نتحول إلى قاعدة بيانات أخرى يومًا ما)، وأريد استرداد الكائنات من قاعدة البيانات وفقًا للسلاسل المقدمة من المستخدم.على سبيل المثال، عند البحث عن أشخاص، إذا كان المستخدم يبحث عن أشخاص يعيشون في "فران"، فأنا أريد أن أكون قادرًا على إعطاء الأشخاص الموجودين في سان فرانسيسكو.

SQL ليست خياري القوي، وأنا أفضل السبات Criteria بناء التعليمات البرمجية لسلاسل مرمزة كما هي.هل يمكن لأي شخص أن يوجهني في الاتجاه الصحيح حول كيفية القيام بذلك في التعليمات البرمجية، وإذا كان ذلك مستحيلًا، كيف يجب أن يبدو SQL المشفر؟

شكرًا،

يوفال = 8-)

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

المحلول

بالنسبة للحالة البسيطة التي تصفها، انظر إلى Restrictions.ilike()، الذي يقوم بإجراء بحث غير حساس لحالة الأحرف.

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', '%fran%');
List results = crit.list();

نصائح أخرى

Criteria crit = session.createCriteria(Person.class);
crit.add(Restrictions.ilike('town', 'fran', MatchMode.ANYWHERE);
List results = crit.list();

إذا كنت تستخدم Spring's HibernateTemplate للتفاعل مع Hibernate، فإليك كيفية إجراء بحث غير حساس لحالة الأحرف على عنوان البريد الإلكتروني للمستخدم:

getHibernateTemplate().find("from User where upper(email)=?", emailAddr.toUpperCase());

ليس عليك أيضًا وضع أحرف البدل '%'.يمكنك تمرير وضع المطابقة (مستندات للإصدارات السابقة هنا) لإخبار البحث بكيفية التصرف. START, ANYWHERE, EXACT, ، و END المباريات هي الخيارات.

الطريقة المعتادة لتجاهل الحالة هي تحويل كل من قيم قاعدة البيانات وقيمة الإدخال إلى أحرف كبيرة أو صغيرة - سيكون لـ SQL الناتج شيء من هذا القبيل

select f.name from f where TO_UPPER(f.name) like '%FRAN%'

في معايير السبات القيود.مثل(...).ignoreCase()

أنا أكثر دراية بـ Nhibernate لذا قد لا يكون بناء الجملة دقيقًا بنسبة 100%

لمزيد من المعلومات انظر استخراج برو السبات 3 و مستندات السبات 15.2.تضييق مجموعة النتائج

معظم عمليات ترتيب قواعد البيانات الافتراضية ليست حساسة لحالة الأحرف، ولكن في عالم SQL Server يمكن تعيينها على المثيل وقاعدة البيانات ومستوى العمود.

يمكنك النظر في استخدام Compass غلافًا فوق لوسين.

http://www.compass-project.org/

من خلال إضافة بعض التعليقات التوضيحية إلى كائنات المجال الخاص بك، يمكنك تحقيق هذا النوع من الأشياء.

توفر Compass واجهة برمجة تطبيقات بسيطة للعمل مع Lucene.إذا كنت تعرف كيفية استخدام ORM، فستشعر وكأنك في بيتك مع البوصلة التي تتميز بعمليات بسيطة للحفظ والحذف والاستعلام.

من الموقع نفسه ."بناءً على Lucene، يعمل Compass على تبسيط أنماط الاستخدام الشائعة لـ Lucene مثل البحث على نمط Google وتحديثات الفهرس بالإضافة إلى مفاهيم أكثر تقدمًا مثل التخزين المؤقت وتقسيم الفهرس (الفهارس الفرعية).تستخدم البوصلة أيضًا تحسينات مضمنة لعمليات الدمج والدمج المتزامنة."

لقد استخدمت هذا في الماضي وأجده رائعًا.

ويمكن القيام بذلك أيضًا باستخدام مثال المعيار الموجود في الحزمة org.hibernate.criterion.

public List findLike(Object entity, MatchMode matchMode) {
    Example example = Example.create(entity);
    example.enableLike(matchMode);
    example.ignoreCase();
    return getSession().createCriteria(entity.getClass()).add(
            example).list();
}

مجرد طريقة أخرى أجدها مفيدة لتحقيق ما ورد أعلاه.

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