在 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");
我有一个 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");