在 JDO 中使用单个查询更新多行

Update multiple rows using single query in JDO

我有一个 table 像这样

订单名称日期
1 张图片 15/6/15
2 图片 2 6/8/16
3 图片3 6/8/16
4 图片4 2016 年 9 月 8 日 ..........

现在,如果我要删除 image2,我想更新 table 以便排序 又是这样的有序形式 更新 Table :
订单名称日期
1 张图片 15/6/15
2 图片3 6/8/16
3 图片4 2016 年 9 月 8 日
..........

那么如何让它成为可能?

这是 class 的 table 图片:

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 + "]";
    }

}

我试过这个查询:String query = "update Images set SORTORDER =((SELECT selected_value FROM (SELECT MAX(SORTORDER) AS selected_value FROM Images where ACTIVE = 0 && PROFILE_Id="+profileId+") AS sub_selected_value) + 1) where PROFILE_Id="+profileId;

但它会将所有 sorOrder 更新为相同的值。

我正在使用此代码更新排序顺序:

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

但这需要更多时间,如果我有 8000 张图像,那么它真的 slow.SO 我想在单个查询中更新。但是没有任何想法

要在一条语句中完成,您可以使用 SQL。这里有几个想法(适应你的用例) - 你使用“?”参数设置在你删除的上面的位置。

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

或者

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

使用 DataNucleus JDOQL UPDATE 扩展你可以做到这一点(并将参数 "param" 设置为 sortOrder 开始点以更新

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