كيف يمكنني تخصيص الاستعلامات المسمى في تطبيق التعليقات التوضيحية السباتية؟
سؤال
هل هناك طريقة لإجراء استفسارات خارجي اسمه HQL إلى ملف خارجي. لدي الكثير من الاستفسارات المسماة واستخدام @NamedQueries
و @NamedQuery
على رأس فصول الكيانات الخاصة بي.
هل هناك وسيلة لنضجها إلى عدة ملفات؟
المحلول
يمكنك وضع الاستعلامات في package-info.java
الفصل ، في ، على سبيل المثال ، حزمة الجذر لكائنات المجال الخاصة بك. ومع ذلك ، يجب أن تستخدم Hibernate الخاصة @NamedQueries
و @NamedQuery
التعليقات التوضيحية ، وليس تلك من javax.persistence
.
مثال package-info.java
ملف:
@org.hibernate.annotations.NamedQueries({
@org.hibernate.annotations.NamedQuery(
name = "foo.findAllUsers",
query="from Users")
})
package com.foo.domain;
ثم ، عليك إضافة الحزمة إلى AnnotationConfiguration
. أستخدم الربيع ، لذلك هناك مسألة إعداد annonatedPackages
منشأه:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="annotatedClasses">
<list>
...
</list>
</property>
<property name="annotatedPackages">
<list>
<value>com.foo.domain</value>
</list>
</property>
يمكنك أيضًا وضع تعريفات النوع والتصفية في نفس الملف أيضًا.
نصائح أخرى
لا أعتقد أن هذا ممكن حيث يجب أن تكون قيم السمة/خاصية التعليقات التوضيحية متوفرة في وقت الترجمة. لذلك ، لا يمكن تمييز السلاسل إلى ملف يحتاج إلى قراءته بواسطة نوع من العملية.
حاولت أن أجد ما إذا كان هناك شيء قد يكون هناك حزمة-java قد تكون قادرة على توفيرها ، لكن لم أتمكن من العثور على أي شيء.
يمكن أن تقوم استراتيجية بديلة للتنظيم بتخزين الاستعلامات كثوابت في الفصل.
في فصل الكيان الخاص بك:
@NamedQuery(name="plane.getAll", query=NamedQueries.PLANE_GET_ALL)
ثم حدد فصلًا عن ثوابت الاستعلام الخاصة بك:
public class NamedQueries {
...
public static final String PLANE_GET_ALL = "select p from Plane p";
...
}
ربما لا يكون هذا بالضبط ما طلبه المؤلف (إلى الخارج إلى ملف غير جافا) ، ولكن هذه هي الطريقة التي حللت بها:
1.) في سياق التطبيق الخاص بي ، أضفت ملف XML mappingResources
إلى SessionFactory
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>META-INF/Country.hbm.xml</value>
</list>
</property>
<property name="annotatedClasses">
<util:list>
<value>com.example.Country</value>
</util:list>
</property>
<property name="hibernateProperties" ref="hibernateProperties" />
</bean>
وفي هذا البلد. hbm.xml لدي
<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings
xmlns="http://java.sun.com/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_2_0.xsd"
version="2.0">
<entity class="com.example.Country">
<named-query name="countryFindByCode">
<query><![CDATA[
select c
from Country c
where c.code = :code
]]></query>
</named-query>
<named-query name="countryFindByName">
<query><![CDATA[
select c
from Country c
where c.name = :name
]]></query>
</named-query>
</entity>
</entity-mappings>
لقد استخدمت ذلك فقط لتحديد الاستعلامات المسماة ، بقية تكوين الكيان في التعليقات التوضيحية.
ربما يساعد هذا شخص ما.
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>META-INF/Country.hbm.xml</value>
</list>
</property>
<property name="annotatedCla
from Country c
where c.name = :name
]]></query>
</named-query>
</entity>
</entity-mappings>