Was ist eine benannte Abfrage?
Mit Hibernate können Sie Abfrageanweisungen in Form von Zeichenfolgen in der Zuordnungsdatei definieren. Diese Abfragemethode wird als benannte Abfrage bezeichnet.
Welche Vorteile bietet die Verwendung benannter Abfragen?
Da die Verwendung von HQL von Hibernate häufig das Schreiben von Zeichenfolgenabfrageanweisungen in Java-Code erfordert, wird HQL zwischen den Codes gemischt, wodurch die Lesbarkeit des Codes beeinträchtigt wird. Durch die Verwendung benannter Abfragen können Sie Geschäftslogik und Abfrageanweisungen trennen und sich so auf Abfragen konzentrieren SQL- oder HQL-Code ist in der gesamten Anwendung verstreut.
Mit benannten Abfragen können komplexe Abfragen verarbeitet werden
Wie implementiert man eine benannte Abfrage?
Wir stellen die folgenden Methoden vor:
Methode 1: Deklarieren Sie die Abfrageanweisung unter dem Tag <class/> in der Konfigurationsdatei
Kopieren Sie den Codecode wie folgt:
<Hibernate-Mapping>
<class name="com.test.bean.Student" table="student" Catalog="users">
<id name="id" type="integer">
<Spaltenname="id" />
<generator />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
</class>
<!-- Abfrageanweisung definieren-->
<Abfragename="findStudentByName">
<![CDATA[from Student where name = :name]]>
</query>
</hibernate-mapping>
Hinweis : Was bedeutet <![CDATA[ ]]>?
Zeigt an, dass es sich um Klartext handelt. Ohne diese Angabe können die Zeichen < > & nicht direkt in XML gespeichert werden und müssen mit Escapezeichen versehen werden. Mit diesem Tag können diese Symbole jedoch ohne Escapezeichen gespeichert werden. Dadurch kann vermieden werden, dass unerwartete Sondersymbole XML-Analysefehler verursachen.
Kopieren Sie den Codecode wie folgt:
public List<Student> query(){
Sitzungssitzung = HibernateSessionFactory.getSession();
Abfrage q = session.getNamedQuery("findStudentByName");
q.setString("name", "zhangsan");
List<Student> list = q.list();
Rückgabeliste;
}
Methode 2 : Sie können die Abfrageanweisung auch im <class/>-Tag in der Konfigurationsdatei deklarieren, müssen sie jedoch beim Aufruf des Java-Codes angeben (Paket + Klasse + Konfigurationsname).
Kopieren Sie den Codecode wie folgt:
<Hibernate-Mapping>
<class name="com.test.bean.Student" table="student" Catalog="users">
<id name="id" type="integer">
<Spaltenname="id" />
<generator />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
<!-- Abfrageanweisung definieren-->
<Abfragename="findStudentByName">
<![CDATA[from Student where name = :name]]>
</query>
</class>
</hibernate-mapping>
public List<Student> query(){
Sitzungssitzung = HibernateSessionFactory.getSession();
Abfrage q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("name", "zhangsan");
List<Student> list = q.list();
Rückgabeliste;
}
Methode drei : Verwenden Sie die native SQL-Abfrage <sql-query>. Bei dieser Methode müssen alle Spalten der Tabelle geschrieben werden. Andernfalls tritt der Fehler „Ungültiger Spaltenname“ auf, es sei denn, Sie verwenden „return-scalar“, um den Feldtyp festzulegen.
Kopieren Sie den Codecode wie folgt:
<Hibernate-Mapping>
<class name="com.test.bean.Student" table="student" Catalog="users">
<id name="id" type="integer">
<Spaltenname="id" />
<generator />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
</class>
<!-- Abfrageanweisung definieren-->
<sql-query name="findStudentByName">
<return alias="s">
</return>
<![CDATA[select {s.*} from student s where s.name = :name]]>
</sql-query>
</hibernate-mapping>
Hinweis : Sie können auch das <return-property/>-Tag innerhalb des <return/>-Tags verwenden, um alle Felder der Tabelle aufzulisten. Genauso wie bei der oben beschriebenen Methode werden alle Spalten abgefragt.
Kopieren Sie den Codecode wie folgt:
public List<Student> query(){
Sitzungssitzung = HibernateSessionFactory.getSession();
Abfrage q = session.getNamedQuery("findStudentByName");
q.setString("name", "zhangsan");
List<Student> list = q.list();
Rückgabeliste;
}
Methode 4 : Verwenden Sie die native SQL-Abfrage <sql-query>. Wenn Sie den Feldtyp mit return-scalar festlegen, können Sie einige Felder abfragen.
Kopieren Sie den Codecode wie folgt:
<Hibernate-Mapping>
<class name="com.test.bean.Student" table="student" Catalog="users">
<id name="id" type="integer">
<Spaltenname="id" />
<generator />
</id>
<property name="name" type="string">
<column name="name" length="11" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="sex" type="string">
<column name="sex" length="2" />
</property>
</class>
<!-- Abfrageanweisung definieren-->
<sql-query name="findStudentByName">
<return-scalar Column="name" type="string"/>
<return-scalar Column="age" type="integer"/>
<![CDATA[select s.name , s.age from student s where s.name = :name]]>
</sql-query>
</hibernate-mapping>
public List<Object[]> query(){
Sitzungssitzung = HibernateSessionFactory.getSession();
Abfrage query = session.getNamedQuery("findStudentByName");
query.setString("name", "zhangsan");
List<Object[]> list = query.list();
Rückgabeliste;
}
oder :
Kopieren Sie den Codecode wie folgt:
public List<Student> query(){
Sitzungssitzung = HibernateSessionFactory.getSession();
Abfrage q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Student.class));
q.setString("name", "zhangsan");
List<Student> list = q.list();
Rückgabeliste;
}