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();
Il existe une fonctionnalité très puissante appelée:
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:
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();
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.