É possível atualizar e remover 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.