Oft möchte der Entwickler HQL-String-Literale über den gesamten Java-Code verteilen. Diese Methode ist schwer zu warten und sieht unschön aus.
Zum Glück kommt Hibernate aus einer Technik namens " names queries ", mit der der Entwickler alle HQL in die XML-Zuordnungsdatei oder über Anmerkungen einfügen kann.
So deklarieren Sie eine benannte Abfrage
Die benannte Abfrage wird sowohl in HQL als auch in native SQL unterstützt. siehe Beispiele …
1. XML-Zuordnungsdatei
HQL in Mapping-Datei
<!-- stock.hbm.xml -->
<hibernate-mapping>
<class name="com.mkyong.common.Stock" table="stock" ...>
<id name="stockId" type="java.lang.Integer">
<column name="STOCK__ID"/>
<generator class="identity"/>
</id>
<property name="stockCode" type="string">
<column name="STOCK__CODE" length="10" not-null="true" unique="true"/>
</property>
...
</class>
<query name="findStockByStockCode">
<![CDATA[from Stock s where s.stockCode = :stockCode]]>
</query>
</hibernate-mapping>
Native SQL in der Zuordnungsdatei
<!-- stock.hbm.xml -->
<hibernate-mapping>
<class name="com.mkyong.common.Stock" table="stock" ...>
<id name="stockId" type="java.lang.Integer">
<column name="STOCK__ID"/>
<generator class="identity"/>
</id>
<property name="stockCode" type="string">
<column name="STOCK__CODE" length="10" not-null="true" unique="true"/>
</property>
...
</class>
<sql-query name="findStockByStockCodeNativeSQL">
<return alias="stock" class="com.mkyong.common.Stock"/>
<![CDATA[select ** from stock s where s.stock__code = :stockCode]]>
</sql-query>
</hibernate-mapping>
Sie können eine benannte Abfrage im ' hibernate-mapping ' - Element platzieren, aber nicht vor dem ' class ' - Element. Hibernate fordert eine ungültige Mapping-Datei auf. Alle Ihre benannten Abfragen müssen hinter dem ' class ' stehen Element.
2. Anmerkung
HQL in der Anmerkung
@NamedQueries({
@NamedQuery(
name = "findStockByStockCode",
query = "from Stock s where s.stockCode = :stockCode"
)
})
@Entity
@Table(name = "stock", catalog = "mkyong")
public class Stock implements java.io.Serializable {
...
Native SQL in annotation
@NamedNativeQueries ({
@NamedNativeQuery (
name = "findStockByStockCodeNativeSQL",
query = "select ** from stock s" = "stockCode",
resultClass = Stock.class
)
})
@Entität
@Table (name = "stock", catalog = "mkyong")
public class Stock implementiert java.io.Serializable {
...
In systemeigenem SQL müssen Sie ' resultClass ' angeben, damit Hibernate den Rückgabetyp erkennt. Andernfalls wird die Ausnahme ausgelöst ** “.
Eine benannte Abfrage aufrufen
Im Ruhezustand können Sie die benannte Abfrage über die getNamedQuery -Methode aufrufen.
Query query = session.getNamedQuery("findStockByStockCode")
.setString("stockCode", "7277");
Query query = session.getNamedQuery("findStockByStockCodeNativeSQL")
.setString("stockCode", "7277");
Schlussfolgerung
Bei benannten Abfragen handelt es sich um globalen Zugriff. Das bedeutet, dass der Name einer Abfrage in XML-Zuordnungsdateien oder -Anmerkungen eindeutig sein muss. In einer realen Umgebung ist es immer ratsam, alle genannten Abfragen in ihrer eigenen Datei zu isolieren. Darüber hinaus sind benannte Abfragen, die in den Hibernate-Zuordnungsdateien oder -Anmerkungen gespeichert sind, einfacher zu verwalten als Abfragen, die im Java-Code verstreut sind.
Link://Tag/Ruhezustand/[Ruhezustand]