Vous pouvez mettre à jour et supprimer des entités à l'aide d'une requête.
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 classe de l'entité Order est identique à celle de l'exemple précédent. La classe fournit toujours l'annotation @Index, car la chaîne de requête utilise la date pour rechercher l'entité. Le moteur de requête utilise des index chaque fois que possible.
public static void cancelOrdersUsingQuery(Session s) {
// Annulez toutes les commandes soumises il y a une minute.
java.util.Date cancelTime =
new java.util.Date(System.currentTimeMillis() - 60000);
EntityManager em = s.getEntityManager();
em.getTransaction().begin();
// Créez une requête qui recherche la commande par rapport à la date. Etant donné
// que nous avons un index défini sur la date de commande, la requête
// l'utilisera automatiquement.
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();
// Vérifiez que la commande n'a pas été mise à jour par une autre personne.
// Etant donné que la requête a utilisé un index, il n'y avait pas de verrou sur la ligne.
if(order != null && order.date.getTime() >= cancelTime.getTime()) {
for(OrderLine line : order.lines) {
// Replacez l'article en stock.
line.item.quantityOnHand += line.quantity;
line.quantity = 0;
}
em.remove(order);
}
}
em.getTransaction().commit();
}
Comme dans l'exemple précédent, la méthode cancelOrdersUsingQuery tente d'annuler toutes les commandes soumises au cours de la dernière minute. Pour annuler la commande, recherchez la commande à l'aide d'une requête, replacez les articles de la commande en stock et supprimez la commande ainsi que les articles de la ligne associée du système.