Guía de aprendizaje del gestor de entidades: actualización y eliminación de entradas utilizando una consulta

Puede actualizar y eliminar entidades utilizando una consulta.

Procedimiento

Actualice y elimine entradas utilizando una consulta.
Order.java
@Entity
public class Order
{
    @Id String orderNumber;
    @Index java.util.Date date;
    @OneToOne(cascade=CascadeType.PERSIST) Customer customer;
    @OneToMany(cascade=CascadeType.ALL, mappedBy="order") 
			@OrderBy("lineNumber") List<OrderLine> lines;  
} 
La clase de entidad de pedido es la misma que en el ejemplo anterior. La clase sigue proporcionando la anotación @Index porque la serie de consulta utiliza la fecha para buscar la entidad. El motor de consultas utiliza índices cuando pueden utilizarse.
public static void cancelOrdersUsingQuery(Session s) {
        // Cancelar todos los pedidos que se sometieron hace un minuto
        java.util.Date cancelTime = 
					new java.util.Date(System.currentTimeMillis() - 60000);
        EntityManager em = s.getEntityManager();
        em.getTransaction().begin();
        
        // Crear una consulta que buscará el pedido en base a la fecha. Como
        // tenemos un índice definido en la fecha del pedido, la consulta
				// lo utilizará automáticamente.
        Query query = em.createQuery("SELECT order FROM Order order 
					WHERE order.date >= ?1");
        query.setParameter(1, cancelTime);
        Iterator<Order> orderIterator = query.getResultIterator();         
			 while(orderIterator.hasNext()) {             
					Order order = orderIterator.next();             
  			// Verificar que otro usuario no haya actualizado el pedido.            
					// Dado que la consulta utilizó un índice, no había ningún bloqueo en la fila.             
					if(order != null && order.date.getTime() >= cancelTime.getTime()) {                 
							for(OrderLine line : order.lines) {                     
   					// Vuelva a añadir el elemento al inventario.                     
								line.item.quantityOnHand += line.quantity;                     
								line.quantity = 0;                 
							}                 
							em.remove(order);             
					}         
			}         
		em.getTransaction().commit();              
}
Como en el ejemplo anterior, el método cancelOrdersUsingQuery intenta cancelar todos los pedidos que se sometieron en el último minuto. Para cancelar el pedido, busque el pedido utilizando una consulta, vuelva a añadir los elementos al inventario y elimine el pedido y los elementos de línea asociados del sistema.