Tutoriel du gestionnaire d'entités : mise à jour et suppression d'entrées à l'aide d'une requête

Vous pouvez mettre à jour et supprimer des entités à l'aide d'une requête.

Procédure

Mettez à jour et supprimez 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.