我有一张这样的桌子
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张图像,那么它真的很慢。我想在单个查询中更新。但是没有任何想法
答案 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");