Mamy列を含むテーブルがあり、クエリを記述できる残りの列に影響を与えずに、行の1つまたはいくつかの列を更新したいと思います。
update table as t set t.a=:a set t.b=:b where t.id=1
しかし、更新するためにどの列が選択されるかわからないので、すべてのシナリオに対してすべてのクエリを作成するのは良い考えではないと思います。シナリオごとにクエリを作成する必要がありますが、テーブルを動的に更新するためのより良い方法を探しています。基準は良い選択だと思います。しかし、問題は、特定の列を更新する基準を作成する方法がわからないことです。私のコードは列を更新できるようになりましたが、他の列はnullまたは空に設定されます。
他の列を変更せずに特定の列を更新するための良い方法は何でしょうか?
Hibernateは、テーブルの列を更新する2つの基本的な方法をサポートしています。
1つ目は、エンティティをsession
にロードし、実行時に変更し、変更をDBにフラッシュ(udpate)することで自然に行われます。これは標準のORMスタイルです。
2つ目は、主に非常に効率的なSQL UPDATEステートメントを対象としています。ここでは次のように文書化されています。
ドキュメントから引用:
...ただし、Hibernateは、Hibernateクエリ言語を介して実行されるSQLスタイルのDMLステートメントを一括実行するためのメソッドを提供します...
条件クエリ用のAPIは提供していませんが、ドメインモデルのHQL ==では機能します。
マップされたエンティティの上にWHERE句を作成し、選択したいくつかの列の更新のみを要求できます。 いくつかの制限があります(JOINはサポートされていません)が、サブクエリによって解決できます...
これはドキュメントからの抜粋です:
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 = session.createQuery( hqlUpdate )
.setString( "newName", newName )
.setString( "oldName", oldName )
.executeUpdate();
tx.commit();
session.close();
このQ&Qも確認してください: Hibernateは基準を使用して更新を実行します
JPAを使用すると、この方法で実行できます。
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaUpdate<User> criteria = builder.createCriteriaUpdate(User.class);
Root<User> root = criteria.from(User.class);
criteria.set(root.get("fname"), user.getName());
criteria.set(root.get("lname"), user.getlastName());
criteria.where(builder.equal(root.get("id"), user.getId()));
session.createQuery(criteria).executeUpdate();
.setString( "newName", newName )
--は非推奨です。新しいメソッドは以下のとおりです!
int updatedEntities1 = session.createQuery( hqlUpdate )
.setParameter("column_name", value)
.executeUpdate();