Hay sintaxis de consulta HQL en Hibernate. Pero lo que estamos más familiarizados es contar las declaraciones SQL. Entonces, ¿cómo debemos hacer SQL de Hibernate Suppnate? No necesitamos considerar esto, el equipo de Hibernate ya lo ha hecho.
No hablemos de tonterías, solo tome un ejemplo.
Seleccionar * de T_USER USR
Lo anterior es una declaración SQL, y no tiene sentido, que todos conocen. ¿Qué debemos hacer si Hibernate quiere ejecutar esta declaración? Mira el código:
Consulta consulta = session.createSqlQuery ("Seleccionar * de t_user usr"); Eso es todo, todos deberían saber lo que queda, y lo que está sucediendo en consultas son normales.
Entonces, ¿qué se devuelve después de la consulta?
while (iter.hasnext ()) {object [] objs = (object []) iter.next (); for (int i = 0; i <objs.length; i ++) {system.out.print (objs [i]); } System.out.println (); } Cada resultado devuelto es una matriz de objeto [].
En este momento, alguien salió y dijo que estaba orientado a objetos. Sí, está orientado a objetos, por desgracia, no hay manera.
Sigamos mirando:
Seleccione {usr.*} de t_user usr Al ver esto, supongo que algunos zapatos para niños comienzan a moverse. ¿Cuáles son los aparatos ortopédicos?
No te preocupes, tómate tu tiempo. Continuemos primero leyendo el código.
La copia del código es la siguiente:
Consulta Query = session.CreateSqlQuery ("Seleccione {usr.*} De t_user usr"). AddEntity (tuser.class);
AddEntitySqlQuery AddEntity (String Tablealias, clase EntityType) Declarar una entidad "raíz": Tablealias - la tabla SQL aliasentityType - el tipo java de la entidad para agregar como raíz
Es lo mismo que es, es una leve chupa. Solo puedes usarlo tú mismo.
El primer parámetro se refiere al alias de la tabla. Al igual que la declaración anterior, el alias de nuestra tabla es USR, por lo que el primer parámetro es USR, y el segundo se refiere a a qué clase se deben asignar los resultados de la consulta. Aquí, dado que nos asignamos a la tabla T_user a través de Tuser en el archivo de mapeo, por supuesto estamos tusadores aquí. Luego, después de verificar, hay declaraciones SQL, y el resultado es de tipo Tuser.
Los resultados que encontramos son:
org.hibernate.tutorial.domain6.tuser@198cb3d
Por supuesto, el tuyo debe ser diferente al mío. No muevas el pollo.
Tal vez no necesitemos averiguar todo, en este momento, todo lo que necesitamos es establecer el alias:
Seleccione U.id como {usr.id}, u.name como {usr.name}, u.age como {usr.age} de t_user u Vemos que utilizamos en cuanto a especificar el alias para el campo, y lo mismo es cierto en el programa:
La copia del código es la siguiente:
Query Query = Session.CreateSqlQuery ("Seleccione U.id como {usr.id}, u.name como {usr.name}, u.age como {usr.age} de t_user u"). Addentity ("usr", tuser.class);
<sql-query = "querytuser"> <return alias = "usr" entity-name = "org.hibernate.tutorial.domain6.tuser" /> select {usr.*} de t_user usr donde name =: name </sql-query> Tenga en cuenta que el nombre de entidad aquí debe escribirse con el nombre completo del paquete, de lo contrario, se informará un error. Aquí tenemos el retorno del subtítulo, que especifica el alias y el nombre de la clase de la tabla, para que no necesitemos adicionalidad en tiempo de ejecución.
Mira el código:
Consulta consulta = session.getNamedQuery ("QueryTuser"); query.setParameter ("nombre", "shun"); List list = query.list (); Iterator iter = list.iterator ();
Estamos bien así. Tenga en cuenta que no hemos agregado adicionalidad, principalmente debido a la configuración en el archivo de configuración.
Tenga en cuenta que si está configurado en el archivo de configuración, debe tener el subtag de retorno para especificar el alias de tabla y el nombre de la clase. Esto evita principalmente juicios repetidos al leer declaraciones.
Después de hablar de ello durante tanto tiempo, hemos estado hablando de tablas con alias. Entonces, ¿qué debemos hacer si nuestra tabla no tiene alias pero queremos encapsular el resultado en el objeto?
Seleccionar * de T_USER USR
Es muy simple. Simplemente llame al método sobrecargado de Addentity Addentity (Class Clazz) y solo necesita proporcionar un nombre de clase, sin el alias de tabla.
Por supuesto, Hibernate también admite procedimientos almacenados. Solo necesita establecer la propiedad llamable de SQL-Query en el verdadero en el archivo de configuración para indicar que los procedimientos almacenados se llaman actualmente. Como no tengo mucho contacto con los procedimientos almacenados, los estudiaré más en el futuro y luego los estudiaré con usted.
Cuando llamamos a los métodos correspondientes de operaciones de datos como Session.save, se convertirá en la declaración SQL incorporada de Hibernate, pero ¿qué pasa si queremos controlar el formato de la declaración SQL nosotros mismos?
Hibernate también lo pensó.
Lo agregamos directamente al archivo de asignación:
<sql-insert> Inserte en valores de t_user (nombre, edad) (?,?) </sql-insert> <sql-update> actualizar user user_name =?, edad =? ¿Dónde user_id =? </sql-update>
Tenga en cuenta que esto debe agregarse en la etiqueta de clase como un subtítulo. Todos somos mayúsculas aquí, para distinguirlas de las declaraciones predeterminadas de Hibernate y no tenemos otro significado.
Primero veamos la llamada para insertar:
Usuario user = nuevo usuario (); user.setName ("shun123123"); user.setage (23); Cuando llamamos guardado, la declaración hibernada es:
Hibernar:
Insertar en valores de usuario (user_name, edad) (?,?)
Llama a las declaraciones en la etiqueta SQL-Insert que configuramos, echemos un vistazo a la llamada a la actualización:
Usuario user = (usuario) session.get (user.class, new Long (29)); user.setName ("shun123123"); user.setage (23); session.save (usuario); Llamamos a Guardar, llamará automáticamente la actualización y la declaración en este momento es:
Hibernar:
Actualizar el usuario establecido user_name =?, Edad =? ¿Dónde user_id =?Vemos que la declaración de salida está en mayúscula, lo que significa que se llama la declaración que configuramos.