web-dev-qa-db-fra.com

Hibernate exécuter la mise à jour avec des critères

Est-il possible d'exécuter une mise à jour en utilisant Criteria dans Hibernate? Par exemple:

Session session = getSession();
Criteria crit = session.createCriteria(User.class);
crit.add(Restrictions.eq("token", sessionToken));

User user= new User();
Transaction tx = session.getTransaction();
try 
{
    tx.begin();
    session.updateWithCriteria(user, crit); //my imaginary function 
    tx.commit();
}
catch (Exception e) 
{
    e.printStackTrace();
    tx.rollback();
}

session.close();
12
vlio20

Il existe une fonctionnalité très puissante appelée:

15.4. Opérations de style DML

petite citation du doc:

... Cependant, Hibernate fournit des méthodes pour l'exécution d'instruction DML de style SQL en bloc qui est effectuée via le langage de requête Hibernate ...

Donc, bien que cela ne concerne pas criteria - nous pouvons toujours utiliser notre modèle de domaine pour les requêtes, car il s'agit de [~ # ~] hql [~ # ~] . Ceci est un extrait montrant la puissance:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

RÉSUMÉ: Ayant cela en place:

  • nous pouvons utiliser la requête pour filtrer les résultats
  • nous pouvons y appliquer une mise à jour groupée
  • nous n'aurons pas besoin de charger ces lignes en mémoire, dans la session ...
11
Radim Köhler

Maintenant, nous pouvons faire quelque chose comme ça pour la mise à jour en masse et la suppression. De nouvelles API sont publiées pour les critèresUpdate et CriteriaDelete

CriteriaBuilder cb = this.em.getCriteriaBuilder();
// create update
CriteriaUpdate<Order> update = cb.createCriteriaUpdate(Order.class);
// set the root class
Root e = update.from(Order.class);
// set update and where clause
update.set("amount", newAmount);
update.where(cb.greaterThanOrEqualTo(e.get("amount"), oldAmount));
// perform update
this.em.createQuery(update).executeUpdate();
6
Payal Bansal

Vous devez d'abord obtenir l'objet, puis le modifier et le mettre à jour:

   Query q = session.createQuery("from StockTransaction where tranId = :tranId ");
   q.setParameter("tranId", 11);
   StockTransaction stockTran = (StockTransaction)q.list().get(0);

   stockTran.setVolume(4000000L);
   session.update(stockTran);

Si vous souhaitez utiliser la fonction de mise à jour partielle/dynamique, mettez

@org.hibernate.annotations.Entity(
        dynamicUpdate = true
)

annotation au-dessus de la classe dao.

Exemple de: http://www.mkyong.com/hibernate/hibernate-dynamic-update-attribute-example/

Remarque: La question est "avec critères" mais la réponse acceptée n'est PAS "avec critères" mais SQL.

1
İsmail Yavuz