web-dev-qa-db-ja.com

Hibernateは条件付きで更新を実行します

CriteriaHibernateを使用しているときに更新を実行することはできますか?例えば:

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

と呼ばれる非常に強力な機能があります。

15.4。DMLスタイルの操作

ドキュメントからの小さな引用:

...ただし、Hibernateは、Hibernateクエリ言語を介して実行されるバルクSQLスタイルのDMLステートメント実行のためのメソッドを提供します...

したがって、これはcriteriaではありませんが、[〜#〜] hql [〜#〜]。これは力を示すスニペットです:

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();

概要:それを適切に設定します。

  • クエリを使用して結果をフィルタリングできます
  • 一括更新を適用できます
  • これらの行をメモリのセッションにロードする必要はありません...
11
Radim Köhler

これで、一括更新と一括削除のためにこのようなことを行うことができます。 criteriaUpdateおよびCriteriaDelete用にリリースされた新しいAPI

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

最初にオブジェクトを取得し、次に変更して更新する必要があります。

   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);

部分的/動的更新機能を使用したい場合は、

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

daoクラスの上のアノテーション。

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

注:質問は「条件付き」ですが、受け入れられた回答は「条件付き」ではなくSQLです。

1
İsmail Yavuz