سؤال

مرحبًا يا رفاق ، أواجه بعض المشكلات في المباريات الدقيقة أثناء القيام بـ NamedQuery.

أنا حاليا أستخدم شيئًا كهذا:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from Entry e where e.name =:"+ Entry.NAME )

...

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName());

إنه يعمل في معظم الحالات ، لكنني لاحظت أنه في حالة مرور المستخدم على اسم الملف بمساحة في النهاية ، يتجاهل NamedQuery هذا الحرف. فمثلا:

Query query = em.createNamedQuery(MyClass.GET_ENTRY_BY_NAME);
        query.setParameter(Entry.NAME, myEntry.getName()+ " ");

سيعود نفس النتيجة مثل الاستعلام من قبل. تجاوز التحقق من صحة "الدخول الصحيح". بمعنى آخر ، أود أن يعيد الاستعلام أي إدخال على الإطلاق وعلاج الخطأ لاحقًا.

أحد الحلول التي يمكن أن أفكر فيها ، هي وضع عروض أسعار واحدة تحيط مع معلمة بلدي في اسم المسمة ، مثل هذا:

@NamedQuery(name = MyClass.GET_ENTRY_BY_NAME, query = "select e from entry e where e.name =':"+ Entry.NAME "'")

ومع ذلك ، فإنه سوف يهمل الكود الخاص بي في حالة احتواء السلسلة على عروض أسعار واحدة فيه ...

أي أفكار يا رفاق؟

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

المحلول 2

لقد أجريت بعض الأبحاث في JPA واكتشفت أنها تقوم ببعض التشذيب التلقائي لـ chars ، لست متأكدًا مما إذا كان هذا يتصرف مع الأوتار ، لكن نظرًا لأنه يحدث لي ... أعتقد ذلك. الطريقة الوحيدة لتجاوزها هي إعداد بعض السمات داخل كائن Databaselogin للجلسة (انظر http://www.eclipse.org/eclipselink/api/1.1/org/eclipse/persistence/sessions/databaselogin.html#setshouldtrimstrings) .

حسنًا ، لم أكن أرغب في التعبئة مع خصائص الجلسة ، لذلك قررت إجراء نوع من الشيكات ورمي نفس الاستثناء الذي يقوم به مصيد NoresultException في الكود الخاص بي.

لقد أخذت النتيجة بشكل أساسي من قاعدة البيانات وقارنت الحقل بالسلسلة التي استخدمتها:

query.setParameter(Entry.NAME, myEntry.getName());

...

if(!StringUtils.equals(result.getName(), myEntry.getName()){
   do a cool throw just like NoResultException Catch
}

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

إدخال قاعدة البيانات: name = "flavio" - تم قطعها باستخدام function = "flavio".

تم تمرير المعلمة: name = "flavio" - تم قطعها بواسطة JPA Automatic Function = "Flavio".

إذا لم يتم تقليصه على الإطلاق ، فسيقارن فقط "Flavio" بـ "Flavio" ، حيث يعيد Noresult عندما كان من المفترض أن يعيد هذا الإدخال.

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

شكرا لجميع الإجابات الأخرى !!

نصائح أخرى

أعتقد أن هذا يحدث لأن حقل قاعدة البيانات الخاص بك يُعلن باسم CHAR(...), ، وبالتالي فإن القيم المخزنة مبطنة بأماكن بيضاء لا تؤخذ في الاعتبار بواسطة = عملية.

لذا ، يمكنك إما إعلان حقل قاعدة البيانات الخاص بك كـ VARCHAR(...) أو استخدم مدمجًا trim وظيفة:

query = "select e from Entry e where trim(trailing from e.name) =:"+ Entry.NAME
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top