2015-03-24 4 views
0

И, имеющей таблицу как этогоОбновление множество строк с использованием одного запроса в JDO

SorOrder Имени Дата
1 Изображение1 5/6/15
2 Изображение2 6/8/16
3 Image3 6/8/16
4 image4 9/8/16 ..........

Теперь, если IAM скачали iMAGE2 я хочу udate стол так, что SortOrder снова в упорядоченной форме, как этот Обновлено Таблица:
SorOrder Имя Дата
1 Изображение1 5/6/15
2 Image3 6/8/16
3 image4 9/8/16
..........

SO как сделать это возможным?

Это класс для таблицы Изображения:

public class Images extends ApplicationEntity{ 

    @Column(name="PROFILE_ID", allowsNull="false") 
    private Profile profile; 
    private int sortOrder; 
    private boolean active; 
    private Date deletedDate; 

    public Images(){ 
     super.setEntity("Images "); 
    } 

    public Images (Profile profile, int sortOrder, boolean active, 
      Date deletedDate) { 
     super(); 
     this.profile = profile; 
     this.sortOrder = sortOrder; 
     this.active = active; 
     this.deletedDate = deletedDate; 
    } 


    public Profile getProfile() { 
     return profile; 
    } 

    public int getSortOrder() { 
     return sortOrder; 
    } 

    public void setSortOrder(int sortOrder) { 
     this.sortOrder = sortOrder; 
    } 

    public boolean isActive() { 
     return active; 
    } 

    public void setActive(boolean active) { 
     this.active = active; 
    } 

    public Date getDeletedDate() { 
     return deletedDate; 
    } 

    public void setDeletedDate(Date deletedDate) { 
     this.deletedDate = deletedDate; 
    } 


    @Override 
    public String toString() { 
     return "Images [profile=" + profile + ", sortOrder=" + sortOrder 
       + ", active=" + active + ", deletedDate=" + deletedDate + "]"; 
    } 

} 

Я попробовал этот запрос: Строка запроса = «обновление изображения установлено SortOrder = ((SELECT selected_value FROM (SELECT MAX (SortOrder) AS selected_value из образов где ACTIVE = 0 & & PROFILE_Id = "+ profileId +") AS sub_selected_value) + 1) где PROFILE_Id = "+ profileId;

Но он обновляет все sorOrder до того же значения.

Я использую этот код для обновления SortOrder:

int sortoder=1; 
for (Images file : imagesListFromDB) { 
      file.setSortOrder(sortOrder); 
      sortOrder++; 
     } 

Но это занимает больше времени, если IAM, имеющие 8000 изображений, то его действительно slow.SO я думал об обновлении в одном запросе. Но не получилось.

+0

СДО работает вокруг классов, не таблицы. Каковы классы, поля PK и т. д. –

+0

Хорошо, у меня есть этот класс с полями 4 поля sortorder, Name, date, active.ANd всякий раз, когда iam удаляет изображение, я буду устанавливать это активное поле изображения t o true и sororder как 0. Но оставшийся порядок сортировки изображений должен быть изменен, как указано выше. – Viveka

ответ

0

Чтобы сделать в одном заявлении, вы можете использовать SQL. Вот пара идей (приспосабливайтесь к вашему прецеденту) - вы используете «?» чтобы установить положение выше того, что вы удаляете.

UPDATE IMAGES SET SORTORDER = 
    (CASE WHEN (SORTORDER <= ?) THEN SORTORDER 
      ELSE (SORTORDER-1) END) 

Или

UPDATE IMAGES SET SORTORDER = SORTORDER-1 
WHERE SORTORDER > ? 

Используя расширение UPDATE DataNucleus JDOQL вы могли бы сделать это (и установите параметр "параметров" в SortOrder начальную точку для обновления

pm.newQuery("UPDATE mydomain.Images SET this.sortOrder=this.sortOrder-1 WHERE this.sortOrder > :param"); 
+0

Если iam удаляет случайные образы. 3-е изображение и 6-е изображение, то это упорядочение не может быть сделано ... – Viveka

+0

, очевидно, это можно сделать ... используйте оператор CASE с несколькими предложениями. –

Смежные вопросы