Foros del Web » Programación para mayores de 30 ;) » Java »

Hibernate - actualizar registros de una consulta

Estas en el tema de Hibernate - actualizar registros de una consulta en el foro de Java en Foros del Web. Saludos nuevamente. Estoy realizando un modulo donde debo repartir aleatoriamente registros entre 25 asesores, tengo una tabla con 4340 registros, y deseo repartir al azar ...
  #1 (permalink)  
Antiguo 28/07/2015, 18:21
 
Fecha de Ingreso: diciembre-2014
Ubicación: Lima
Mensajes: 68
Antigüedad: 9 años, 4 meses
Puntos: 0
Hibernate - actualizar registros de una consulta

Saludos nuevamente.
Estoy realizando un modulo donde debo repartir aleatoriamente registros entre 25 asesores, tengo una tabla con 4340 registros, y deseo repartir al azar a cada asesor entre 200 registros.
Para ello en la tabla donde tengo lo 4340 hay un campo llamada idAsesor.

Con este codigo pude hacer la consulta aleatoria, por ahora es un test.
Código Java:
Ver original
  1. public void aleatorio() {
  2.         Session session = HibernateUtil.getSessionFactory().openSession();
  3.         try {
  4.             session.getTransaction().begin();
  5.             Criteria criteria = session.createCriteria(Base.class);
  6.             criteria.add(Restrictions.eq("asesor.id", 91));
  7.             criteria.add(Restrictions.sqlRestriction("1=1 order by NEWID()"));
  8.             criteria.setMaxResults(206);
  9.             List<Base> bases = null;
  10.             bases = criteria.list();
  11.             for (Base base : bases) {
  12.                 System.out.println(base.getNumerodocumento());
  13.             }
  14.             session.getTransaction().commit();
  15.         } catch (Exception e) {
  16.             session.getTransaction().rollback();
  17.         }      
  18.     }

Ahora solo deseo actualizarel idAsesor con el id de cada uno de ellos en esos 206 registros.
Alguien que me ayude
Gracias.

PD: La consulta SQL SERVER para realizar la actualizacion es esta:
Código SQL:
Ver original
  1. UPDATE base SET asesor='14' WHERE numerodocumento IN (SELECT top 206 numerodocumento FROM base WHERE asesor='91' ORDER BY NEWID())
  #2 (permalink)  
Antiguo 29/07/2015, 08:12
Avatar de GusGarsaky  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 2 meses
Puntos: 2
Respuesta: Hibernate - actualizar registros de una consulta

Se supone que ya tienes los 206 registros, entonces, recorrelos y actualiza el idAsesor y haces un merge:

Código Java:
Ver original
  1. for(Base base : bases) {
  2.     base.setIdAsesor("nuevo asesor id");
  3.     // actualiza los datos en la BD
  4.     em.merge(base);
  5. }

Por lo que veo, estás usando Hibernate nativo (usa JPA cuando puedas por portabilidad), entonces el equivalente de EntityManager es Session.

Código Java:
Ver original
  1. for(Base base : bases) {
  2.     base.setIdAsesor("nuevo asesor id");
  3.     // actualiza los datos en la BD
  4.     session.merge(base);
  5. }
  #3 (permalink)  
Antiguo 29/07/2015, 11:54
 
Fecha de Ingreso: diciembre-2014
Ubicación: Lima
Mensajes: 68
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Hibernate - actualizar registros de una consulta

Hola, gracias por responder, pude resolver el problema, solo habia que hacer eso:
Código Java:
Ver original
  1. public void repartir(Asesor asesor, int cant) {
  2.         try {
  3.             session.getTransaction().begin();
  4.             Criteria criteria = session.createCriteria(Base.class);
  5.             criteria.add(Restrictions.eq("asesor.id", 91));
  6.             criteria.add(Restrictions.sqlRestriction("1=1 order by NEWID()"));
  7.             criteria.setMaxResults(cant);
  8.             List<Base> bases = null;
  9.             bases = criteria.list();
  10.             for (Base base : bases) {
  11.                 base.setAsesor(asesor);
  12.                 System.out.println(base.getNumerodocumento() + ", " + base.getAsesor().getId());
  13.             }
  14.             session.getTransaction().commit();
  15.         } catch (Exception e) {
  16.             session.getTransaction().rollback();
  17.         }      
  18.     }

Desde mi aplicacion envio el objeto asesor y la cantidad que se le repartira.

No entendí muy bien lo de merge, he visto que no usan Session, sino SessionFactory, es a eso a lo que te refieres, sino para investigar mas a fondo.
  #4 (permalink)  
Antiguo 29/07/2015, 12:13
Avatar de GusGarsaky  
Fecha de Ingreso: febrero-2015
Mensajes: 33
Antigüedad: 9 años, 2 meses
Puntos: 2
Respuesta: Hibernate - actualizar registros de una consulta

SessionFactory es una factoría de objetos Session. Los objetos Session son los que te permiten persistir y recuperar. Me parece raro que no lo notes si lo estás usando para empezar una transacción (session.getTransaction().begin()).

Código Java:
Ver original
  1. SessionFactory factory = new Configuration().configure().buildSessionFactory();
  2. Session session = factory.openSession();
  3.  
  4. // persiste
  5. session.persist(unobjeto);
  6. // actualiza
  7. session.merge(unobjetomodificado);
  8. // remueve
  9. session.delete(unobjeto);
  #5 (permalink)  
Antiguo 04/08/2015, 19:30
 
Fecha de Ingreso: diciembre-2014
Ubicación: Lima
Mensajes: 68
Antigüedad: 9 años, 4 meses
Puntos: 0
Respuesta: Hibernate - actualizar registros de una consulta

Al final pude hacer lo que deseaba.
Para ello hice los siguiente.

Lo primero que hice fue crear una tabla donde guardare los DNI e inserto la consulta que me devuelve los datos aleatorios.
Código SQL:
Ver original
  1. INSERT INTO temporal (SELECT numerodocumento FROM base WHERE asesor='91' AND ENRIQUECIDO = 'ENRIQUECIDO' ORDER BY RAND() LIMIT 200)

Luego actualizo de la siguiente forma.

Código SQL:
Ver original
  1. UPDATE base SET asesor = 17 WHERE NUMERODOCUMENTO IN(SELECT * FROM temporal)

Por ultimo elimino todos los registros de la tabla auxiliar

Código XML:
Ver original
  1. delete from temporal


Y asi continuo con la demas reparticion

Gracias

Etiquetas: hibernate, registros, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:37.