@transactional定義usercouponitemrelationlist為全域性變數的時候,使用for迴圈遍歷。第一次迴圈,usercouponitemrelationlist新增了五個元素,第二次迴圈新增了三個,第二次的時候,usercouponitemrelationlist元素為8public apiresult sendcoupon(couponrequest couponrequest)
if(stringutils.isblank(couponrequest.getuserids()))
miniprogram miniprogram = miniprogramservice.querybytoken(couponrequest.getprogramtoken());
optional.ofnullable(miniprogram).orelsethrow(() -> new miniexception(errcode.program_not_exists));
optional.ofnullable(couponrequest.getid()).orelsethrow(()->new couponexception(errcode.primary_id_not_null));
coupon entity=couponservice.getcoupon(couponrequest.getid());
string str=couponrequest.getuserids().split(",");
usercoupon usercoupon=null;
usercoupondetail usercoupondetail=null;
usercouponitemrelation usercouponitemrelation=null;
usercouponshoprelation usercouponshoprelation=null;
listusercouponitemrelationlist=new arraylist<>();
listusercouponshoprelationlist=null;
for(int i=0;i//關聯會員優惠券表
usercoupon=new usercoupon();
usercoupon.setuserinfoid(long.parselong(str[i]));
usercoupon.setusestatus(boolean.false);//未使用
usercoupon.setcouponid(entity.getid());
usercoupon.setsouce(couponsouceenum.business_distribution.getname());//商家派發
usercoupon.setcreatetime(new date());
usercoupon.setupdatetime(new date());
//儲存獲取主鍵id
usercouponservice.insert(usercoupon);
//關聯會員優惠券明細表
usercoupondetail=new usercoupondetail();
usercoupondetail.setcouponid(entity.getid());
usercoupondetail.setusercouponsid(usercoupon.getid());
usercoupondetail.setcouponname(entity.getname());//優惠券名稱
usercoupondetail.setcoupontype(entity.getcoupontype());//優惠券型別
usercoupondetail.setdeduct(entity.getdeduct());//抵扣金額
usercoupondetail.setdiscount(entity.getdiscount());//折扣比率
usercoupondetail.setlowerconsumeramount(entity.getlowerconsumeramount());//最低消費
usercoupondetail.setuserange(entity.getuserange());//使用範圍
usercoupondetail.setvalidstartdate(entity.getvalidstartdate());//有效期開始時間
usercoupondetail.setvalidenddate(entity.getvalidenddate());//有效期結束時間
usercoupondetail.setremark(entity.getremark());
usercoupondetailservice.addusercoupondetail(usercoupondetail);
if(entity.getuserange().equals(userangeenum.part.getname()))
usercouponitemrelationservice.batchaddusercouponitemrelation(usercouponitemrelationlist);
}//關聯會員優惠券門店表
listcouponshoprelationlist=couponshoprelationservice.querybycouponid(entity.getid());
usercouponshoprelationlist=new arraylist<>();
for(couponshoprelation couponshoprelation:couponshoprelationlist)
usercouponshoprelationservice.batchaddusercouponshoprelation(usercouponshoprelationlist);
}entity.setremainamount(entity.getremainamount()-str.length);
couponservice.updatecoupon(entity);
apiresult.succ(entity);
return apiresult;
}
一共儲存了5+(5+3)=13條記錄
我預期是5+3=8
出現問題的根本原因就是usercouponitemrelationlist每次迴圈一直追加
解決方案:
在外部申明:
listusercouponitemrelationlist=null;在每次迴圈的時候分配記憶體
listusercouponitemrelationlist=new arraylist<>();
或:使用arraylist.clear() 每次迴圈清空、
public void clear()
擴充套件:物件的宣告放在棧記憶體,在例項化物件的時候,會在堆記憶體開闢乙個記憶體,然後把這個記憶體的位址交給物件。這個就是物件的宣告和例項化過程
一)關於使用arraylist儲存全域性變數
**如下:
public static void main(string args)
for(int i=0;i<3;i++)
}輸出結果:
demo [id=0]
demolist.get(i):0
demo [id=1]
demolist.get(i):1
demo [id=2]
demolist.get(i):222
2問:為什麼在迴圈輸出時候提取list是相同?
個人總結:
(1)list裡面雖然有3個元素,但是元素的物件指向的位址都是同乙個記憶體位址。
(2)你只new一次,但是只為demo分配乙個位址,但是每次都是操作這個demo,第乙個迴圈。
(3)另外,因為list是允許元素重複的,所以,你同乙個物件可以加n次,另乙個集合set是不允許元素重複。
元素重複的意思是,記憶體位址一樣
(4)最後一次則新增id為2,則覆蓋之前的id,arraylist則儲存最後乙個物件的值。
二)使用arraylist儲存區域性變數
對於上邊的程式,把宣告放到for迴圈裡面時候,則是不同的指向位址。
public static void main(string args)
for(int i=0;i<3;i++)
}執行結果:
引數為空,選擇全部
在使用wyn enterprise 設計報表時,經常會用到查詢引數。使用者帶有引數的報表,在檢視時,未選擇引數值即可以顯示全部資料。選擇引數值後,則按照引數值過濾查詢。即引數為空,選擇全部。如下圖。實現此效果,需要在報表內嵌資料集中使用動態sql。sql寫法 select from demo 銷售明...
自定義實現ArrayList
package com.mylist public class myarraylist 返回list的大小 return public int size 判斷是否為空 return public boolean isempty 建立指定大小的list集合 param init public myar...
ArrayList實現自定義排序
arraylist中存在sort排序方法,只要你實現了comparator的介面,按照你自己的排序業務進行實現,你只要告訴這個介面按照什麼型別進行排序就ok了。這種方式類似於設計模式中的策略模式,把流程劃分好,具體的業務邏輯由使用者指定 實現 public class comparatortest ...