Tutorial do Entity Manager: Atualizando e Removendo Entradas Utilizando uma Consulta

É possível atualizar e remover entidades utilizando uma consulta.

Procedimento

Atualize e remova entidades utilizando uma 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;  } 
A classe de entidade order é a mesma que a do exemplo anterior. A classe ainda fornece a anotação @Index, porque a cadeia de consultas utiliza a data para localizar a entidade. O mecanismo de consulta utiliza índices quando eles podem ser utilizados.
public static void cancelOrdersUsingQuery(Session s) {
        // Cancel all orders that were submitted 1 minute ago
        java.util.Date cancelTime = 
					new java.util.Date(System.currentTimeMillis() - 60000);
        EntityManager em = s.getEntityManager();
        em.getTransaction().begin();
        
        // Create a query that will find the order based on date.  Since
        // we have an index defined on the order date, the query 
				// will automatically use it.
        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 se o pedido não foi atualizado por outra pessoa.             
					// Since the query used an index, there was no lock on the row.             
					if(order != null && order.date.getTime() >= cancelTime.getTime()) {                 
							for(OrderLine line : order.lines) {                     
								// Incluir o item novamente no inventário.                     
								line.item.quantityOnHand += line.quantity;                     
								line.quantity = 0;                 
							}                 
							em.remove(order);             
					}         
			}         
		em.getTransaction().commit();              
}
Como o exemplo anterior, o método cancelOrdersUsingQuery é destinado a cancelar todos os pedidos que foram enviados no último minuto. Para cancelar o pedido, você o localiza utilizando uma consulta, inclui os itens no pedido de volta no inventário e remove o pedido e os itens de linha associados do sistema.