سؤال

هل هناك مجموعة قواعد / أفضل الممارسات / الكشف عن مجريات الأمور لاتخاذ قرار بين واجهة برمجة التطبيقات للمعايير و الاستعلام الاسمي ؟

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

لكن ربما إن الرغبة في "مرونة" الاستعلام باستخدام معايير API هي تلميح إلى التصميم دون المستوى الأمثل (أي فصل الاهتمامات)؟

شكرًا لك

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

المحلول

تعد الاستعلامات المسماة أمثل (يتم تحليلها / تحضيرها مرة واحدة).تعد استعلامات المعايير ديناميكية (لم يتم تجميعها مسبقًا ، على الرغم من أن بعض موفري JPA مثل EclipseLink يحتفظون بمعايير لإعداد ذاكرة التخزين المؤقت).

سأستخدم المعايير فقط لطلبات البحث الديناميكية.

نصائح أخرى

تعد استعلامات المعايير اختيارًا جيدًا عندما يجب إنشاء استعلام ديناميكيًا ، بناءً على معايير البحث المتغيرة والمتعددة ، على سبيل المثال.

بالنسبة إلى الاستعلامات الثابتة ، تعد JPQL أكثر قابلية للقراءة ، وأنا أفضل استخدامها بدلاً من استعلامات المعايير.قد تفقد بعض الأمان ، ولكن اختبارات الوحدة تجعلك أكثر ثقة.

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

من ناحية أخرى ، لست متأكدًا من أن هذا مفيد أكثر من بساطة JPQL

I actually went through the Hibernate (4.3.0-SNAPSHOT) source and the EclipseLink (2.5.0-SNAPSHOT) source and looked through the JPA implementation in each.

EclipseLink is clearly not thread safe in the manner you describe. Specifically it tries to recalculate joins repeatedly.

Hibernate's implementation looks thread safe to me. I'm not 100% sure, but it does seem to be. I would say that this is not guaranteed to be true in the future since it isn't specified.

However, I will warn you, I don't think you're going to gain much. From what I'm looking at, much of the compilation of the query is actually done during the "createQuery" phase so you wouldn't even gain much caching the results.

JPA also provides a way for building static queries, as named queries, using the @NamedQuery and @NamedQueries annotations. It is considered to be a good practice in JPA to prefer named queries over dynamic queries when possible. From http://www.objectdb.com/java/jpa/query/api

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