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]