Hibernate benannte Abfragebeispiele

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]