¿Qué es una consulta con nombre?
Hibernate le permite definir declaraciones de consulta en forma de cadenas en el archivo de mapeo. Este método de consulta se denomina consulta con nombre.
¿Cuáles son los beneficios de utilizar consultas con nombre?
Dado que el uso de HQL de Hibernate a menudo requiere escribir declaraciones de consulta de cadena en código Java, HQL se mezcla entre códigos, lo que destruye la legibilidad del código. Al utilizar consultas con nombre, puede separar la lógica empresarial y las declaraciones de consulta, lo que le permite centrarse en las consultas. El código SQL o HQL se encuentra disperso por toda la aplicación.
Las consultas con nombre se pueden utilizar para procesar consultas complejas.
¿Cómo implementar una consulta con nombre?
Presentamos los siguientes métodos:
Método 1: declarar la declaración de consulta bajo la etiqueta <class/> en el archivo de configuración
Copie el código de código de la siguiente manera:
<mapeo-hibernación>
<nombre de clase="com.test.bean.Student" table="estudiante" catalog="usuarios">
<id nombre="id" tipo="entero">
<nombre de columna="id" />
<generador/>
</id>
<nombre de propiedad="nombre" tipo="cadena">
<columna nombre="nombre" longitud="11" />
</propiedad>
<nombre de propiedad="edad" tipo="entero">
<nombre de columna="edad" />
</propiedad>
<nombre de propiedad="sexo" tipo="cadena">
<nombre de columna="sexo" longitud="2" />
</propiedad>
</clase>
<!-- Definir declaración de consulta-->
<nombre de consulta="findStudentByName">
<![CDATA[de Estudiante donde nombre = :nombre]]>
</consulta>
</hibernate-mapping>
Nota : ¿Qué significa <![CDATA[ ]]>?
Indica que es texto sin formato, los caracteres < > & no se pueden almacenar directamente en XML y es necesario escaparlos. Sin embargo, con esta etiqueta, estos símbolos se pueden almacenar en documentos XML sin escape. Esto puede evitar símbolos especiales inesperados que provoquen errores de análisis XML.
Copie el código de código de la siguiente manera:
Lista pública<Estudiante> consulta(){
Sesión de sesión = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("findStudentByName");
q.setString("nombre", "zhangsan");
Lista<Estudiante> lista = q.list();
lista de devolución;
}
Método 2 : también puede declarar la declaración de consulta en la etiqueta <class/> en el archivo de configuración, pero debe especificarla al llamar al código Java (paquete + clase + nombre de configuración)
Copie el código de código de la siguiente manera:
<mapeo-hibernación>
<nombre de clase="com.test.bean.Student" table="estudiante" catalog="usuarios">
<id nombre="id" tipo="entero">
<nombre de columna="id" />
<generador/>
</id>
<nombre de propiedad="nombre" tipo="cadena">
<columna nombre="nombre" longitud="11" />
</propiedad>
<nombre de propiedad="edad" tipo="entero">
<nombre de columna="edad" />
</propiedad>
<nombre de propiedad="sexo" tipo="cadena">
<nombre de columna="sexo" longitud="2" />
</propiedad>
<!-- Definir declaración de consulta-->
<nombre de consulta="findStudentByName">
<![CDATA[de Estudiante donde nombre = :nombre]]>
</consulta>
</clase>
</hibernate-mapping>
Lista pública<Estudiante> consulta(){
Sesión de sesión = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("com.test.bean.Student.findStudentByName");
q.setString("nombre", "zhangsan");
Lista<Estudiante> lista = q.list();
lista de devolución;
}
Método tres : utilice la consulta SQL nativa <sql-query>. En este método, se deben escribir todas las columnas de la tabla; de lo contrario, se producirá un error de "nombre de columna no válido" a menos que utilice return-scalar para establecer el tipo de campo.
Copie el código de código de la siguiente manera:
<mapeo-hibernación>
<nombre de clase="com.test.bean.Student" table="estudiante" catalog="usuarios">
<id nombre="id" tipo="entero">
<nombre de columna="id" />
<generador/>
</id>
<nombre de propiedad="nombre" tipo="cadena">
<columna nombre="nombre" longitud="11" />
</propiedad>
<nombre de propiedad="edad" tipo="entero">
<nombre de columna="edad" />
</propiedad>
<nombre de propiedad="sexo" tipo="cadena">
<nombre de columna="sexo" longitud="2" />
</propiedad>
</clase>
<!-- Definir declaración de consulta-->
<nombre de consulta SQL="findStudentByName">
<regresar alias="s">
</retorno>
<![CDATA[seleccione {s.*} de los estudiantes donde s.nombre = :nombre]]>
</sql-consulta>
</hibernate-mapping>
Nota : También puede utilizar la etiqueta <return-property/> dentro de la etiqueta <return/> para enumerar todos los campos de la tabla. Al igual que el método descrito anteriormente, se consultan todas las columnas.
Copie el código de código de la siguiente manera:
Lista pública<Estudiante> consulta(){
Sesión de sesión = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("findStudentByName");
q.setString("nombre", "zhangsan");
Lista<Estudiante> lista = q.list();
lista de devolución;
}
Método 4 : utilice la consulta SQL nativa <sql-query>. Si utiliza return-scalar para establecer el tipo de campo, puede consultar algunos campos.
Copie el código de código de la siguiente manera:
<mapeo-hibernación>
<nombre de clase="com.test.bean.Student" table="estudiante" catalog="usuarios">
<id nombre="id" tipo="entero">
<nombre de columna="id" />
<generador/>
</id>
<nombre de propiedad="nombre" tipo="cadena">
<columna nombre="nombre" longitud="11" />
</propiedad>
<nombre de propiedad="edad" tipo="entero">
<nombre de columna="edad" />
</propiedad>
<nombre de propiedad="sexo" tipo="cadena">
<nombre de columna="sexo" longitud="2" />
</propiedad>
</clase>
<!-- Definir declaración de consulta-->
<nombre de consulta SQL="findStudentByName">
<columna escalar de retorno="nombre" tipo="cadena"/>
<retorno-columna escalar="edad" tipo="entero"/>
<![CDATA[seleccione s.name , s.age de los estudiantes donde s.name = :name]]>
</sql-consulta>
</hibernate-mapping>
Lista pública<Objeto[]> consulta(){
Sesión de sesión = HibernateSessionFactory.getSession();
Consulta de consulta = session.getNamedQuery("findStudentByName");
query.setString("nombre", "zhangsan");
Lista<Objeto[]> lista = query.list();
lista de devolución;
}
o :
Copie el código de código de la siguiente manera:
Lista pública<Estudiante> consulta(){
Sesión de sesión = HibernateSessionFactory.getSession();
Consulta q = session.getNamedQuery("findStudentByName").
setResultTransformer(Transformers.aliasToBean(Estudiante.clase));
q.setString("nombre", "zhangsan");
Lista<Estudiante> lista = q.list();
lista de devolución;
}