سؤال

أرغب في تحديث جميع حقول الجدول الذي يحتوي على قيمة اسم Colum باسم "PCName". اسم الجدول الذي أريد تحديثه هو XYZ.I أريد تحديث بعض الحقول فقط وعدم الاحتفاظ ببعضها دون تغيير.

سيؤثر هذا على العديد من الصفوف وليس صفًا واحدًا حيث سيكون هناك العديد من الصفوف مع name = 'pcname' كيف يمكنني القيام بذلك باستخدام jpa.I لدي فئة كيان مرتبطة بهذا الجدول.

هل كانت مفيدة؟

المحلول

يمكنك إما القيام بذلك بالطريقة الموجهة للكائن أو استخدام استعلام تحديث.

وجوه المنحى:

public void setNameOfAllEntities(String newname){
    List<MyEntity> items =
        entityManager.createQuery("from MyEntity", MyEntity.class)
            .getResultList();
    for(MyEntity entity : items){
        entity.setName(newname);
    }
}

مع استعلام التحديث (لم يتم اختباره):

public void setNameOfAllEntities(final String newname){

    final int changes =
        entityManager.createQuery("update MyEntity set name = :name")
            .setParameter("name", newname)
            .executeUpdate();

    System.out.println(changes + " rows changed");

}

من الواضح أن الإصدار الثاني يعمل بشكل أفضل.

نصائح أخرى

Seanizer إجابه هو صحيح (+1) وسيكون التحديث بالجملة لطيفًا بالفعل لحالة الاستخدام هذه. ولكن يجب أن تتخذ بعض الاحتياطات مع عمليات التحديث بالجملة. لإعادة صياغة مواصفات JPA:

  • تحديثات السائبة تتجاوز الشيكات المتفائلة من القفل (لذلك يجب عليك زيادة عمود الإصدار و/أو التحقق يدويًا في صحة عمود الإصدار إذا رغبت في ذلك)
  • لا يتم مزامنة سياق الثبات مع نتيجة العمليات السائبة (يجب إجراء العمليات بالجملة في معاملة منفصلة أو في بداية المعاملة ، قبل تحميل حالة أي كيان قد يتأثر).

وبالتالي ، فإن اقتراحي هو زيادة عمود الإصدار على الأقل لتجنب مشكلة التزامن مع مؤشرات الترابط الأخرى:

UPDATE XYZ xyz
SET xyz.name = :newname, xyz.version = xyz.version + 1 

ولقيامها في معاملة منفصلة أو قبل تحميل أي XYZ كما هو موضح سابقًا.

مراجع

  • مواصفات JPA 1.0
    • القسم 4.10 "التحديث بالجملة وحذف العمليات"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top