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

时间:2015-03-24 10:15:31

标签: sql jdo datanucleus

我有一张这样的桌子

SorOrder名称日期
1 Image1 5/6/15
2 Image2 6/8/16
3 Image3 6/8/16
4 Image4 9/8/16 ..........

现在如果iam删除image2我想更新表格以便排序 再次是这样的有序形式 更新表:
SorOrder名称日期
1 Image1 5/6/15
2 Image3 6/8/16
3 Image4 9/8/16
..........

如何让它成为可能的?

这是表格的类:

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 FROM Images其中ACTIVE = 0&& PROFILE_Id =" + profileId +")AS sub_selected_value)+ 1)其中PROFILE_Id =" + profileId;

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

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

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

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

1 个答案:

答案 0 :(得分:0)

要在单个语句中执行,您可以使用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");