Hablemos de la consulta de criterios, lo cual es fácil para los programadores que no estamos muy familiarizados con las declaraciones SQL.
Sin más preámbulos, echemos un vistazo al ejemplo:
La clase de entidad es la siguiente:
El usuario de la clase pública implementa serializable {private static final long SerialVersionUid = 1l; Identificación pública larga; nombre de cadena privada; edad privada int; // omitir el método get/set} No escribiremos el archivo de asignación, es una entidad muy simple. Si no comprende los zapatos para niños, consulte mis otros artículos en la categoría Hibernate.
A continuación, veamos cómo usar los criterios para consultar:
public static void main (string [] args) {Configuration cfg = new Configuration (). Configuración (); SessionFactory sessionFactory = cfg.BuildSessionFactory (); Sesión session = sessionFactory.opensession (); Criterios criterios = session.createCriteria (user.class); criteria.add (restrictions.eq ("nombre", "shun")); List list = criteria.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Al ver el código, es una cadena muy simple.
Todos estamos familiarizados con los anteriores, y vemos el código después de construir la sesión:
Criterios criterios = session.createCriteria (user.class); criteria.add (restrictions.eq ("nombre", "shun")); Estas dos oraciones de código son los puntos clave. Analicemos ¿qué significa exactamente?
En la primera oración, obtenemos un objeto de la clase de implementación de criterios a través de la sesión, y en la segunda oración, agregamos una condición a través del método ADD, y EQ representa la igualdad. Hibernate3 se implementó previamente a través de la expresión. Después de 3, dado que los criterios fueron abandonados, utilizamos la clase de restricciones para implementarla, que es lo mismo que la expresión. Veamos la API y encontremos que la expresión hereda de las restricciones.
Volviendo a nuestras dos oraciones anteriores, después de que terminamos estas tareas, Hibernate en realidad nos ayudó a construir una forma similar.
Seleccione * del usuario donde nombre = 'shun'
Tal declaración. (Aquí, la tabla correspondiente a la clase de usuario en nuestro archivo de asignación es la tabla de usuario, y el atributo de nombre corresponde al campo Nombre)
Las restricciones también tienen muchos métodos para ayudarnos a construir declaraciones SQL. Es fácil de entender después de verificar la API.
Revisemos el código anterior. Si cerramos la sesión, pero queremos continuar usando este criterio, ¿está bien? Echemos un vistazo.
Después del código anterior, volvemos a traver, agregando:
List list2 = criteria.list (); Iterator iter2 = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } Para distinguir la diferencia entre la lista anterior y Iter, usamos otro aquí.
Ejecutarlo y obtenemos una excepción:
org.hibernate.sessionException: ¡La sesión está cerrada!
Informar esta excepción significa que la sesión ha sido cerrada. En muchos casos, informaremos excepciones similares después de cerrar la sesión y luego realizar operaciones relacionadas con SaveorUpdate, Save, etc.
Hibernate3 tiene en cuenta nuestras necesidades e implementa un criterio desachado, que puede existir independientemente de la sesión.
Echemos un vistazo al ejemplo: (la entidad aún está arriba)
public static void main (string [] args) {Configuration cfg = new Configuration (). Configuración (); SessionFactory sessionFactory = cfg.BuildSessionFactory (); Sesión session = sessionFactory.opensession (); Decriterios de Criterios DETACHED = Criteria de DETACHEDCOR.FORCLASS (user.class); decriteria.add (restrictions.eq ("nombre", "shun")); List list = Decriteria.getExecutableCriteria (sesión) .list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); Sesión session2 = sessionFactory.opensession (); List list2 = Decriteria.getExecutableCriteria (session2) .list (); Iterador iter2 = list2.Iterator (); while (iter2.hasnext ()) {user user = (user) iter2.Next (); System.out.println (user.getName ()+":"+user.getage ()); }} Vemos que después de que se cierre la sesión, podemos continuar utilizando Criterios Desanse en otro sentido. Necesitamos asociar los criterios de DETACHED actual con una determinada sesión a través de getExecutableCriteria (sesión de sesión).
A continuación, echemos un vistazo a la combinación de la clase de subcontratadas y los criterios desached:
public static void main (string [] args) {Configuration cfg = new Configuration (). Configuración (); SessionFactory sessionFactory = cfg.BuildSessionFactory (); Sesión session = sessionFactory.opensession (); Decriterios de Criterios DETACHED = Criteria de DETACHEDCOR.FORCLASS (user.class); decriteria.setProyection (Projections.avg ("edad")); Criterios criterios = session.createCriteria (user.class); criterio.add (subconsulto.propertygt ("edad", decriterios)); List list = criteria.list (); Iterator iter = list.iterator (); while (iter.hasnext ()) {user user = (user) iter.next (); System.out.println (user.getName ()+":"+user.getage ()); } session.close (); } Supongo que la primera oración de código tiene preguntas:
decriteria.setProyection (Projections.avg ("edad")); Este código se refiere a obtener el valor promedio de la edad a través de los deciterios. Luego obtenga el objeto con una edad mayor que el valor promedio a continuación.
Las proyecciones contienen muchos métodos de encapsulación que implementan métodos SQL. Puedes echar un vistazo a la API.
Aprendamos sobre su uso un poco más avanzado.
Solo mira el código:
criterio.setFirStresult (10); criterios.setMaxResults (20);
Aquí establecemos el registro inicial como el Artículo 10, y luego encontramos 20 registros del Artículo 10. Según esta práctica, podemos implementar la función de paginación básica.
Por supuesto, necesitamos clasificar en muchos casos, y los criterios también lo respalden:
criteria.addorder (orden.desc ("edad")); Aquí, podemos usar el método AddOrder directamente y obtener un objeto de pedido a través de Order.desc, que requiere un parámetro de atributo. De hecho, cuando llamamos a AddOrder, Hibernate nos ayudará a generar orden por edad, tal declaración.
¿Cómo hacemos esto cuando necesitamos agruparlo? Esto requiere el método Groupproperty de la clase de proyecciones que mencionamos la última vez.
criterio.setProyection (proyects.groupProperty ("edad")); Aquí nos agrupamos de acuerdo con el atributo de edad, que en realidad se agrupa a través de la edad del campo correspondiente a la edad. Hibernate lo convertirá automáticamente en una declaración como el grupo por edad.
Hay muchos métodos prácticos en proyecciones (tenga en cuenta que esto solo está disponible después de Hibernate 3).