1. 程式人生 > >hibernate Query list()的快取問題

hibernate Query list()的快取問題

直接上程式碼

String hql="from MemberCardEntity where memberId='"+mid+"' and (CURDATE()<= deadline OR deadline is NULL)";
List<MemberCardEntity> cards=new ArrayList<MemberCardEntity>();
List<MemberCardEntity> memberCards = systemService.findByQueryString(hql);
for (MemberCardEntity memberCardEntity : memberCards) {
String memberCardType=memberCardEntity.getType();
if("5".equals(memberCardType)){//型別為時限卡
cards.add(memberCardEntity);
}else{
int count=0;
List<MemberItemEntity> items=memberCardEntity.getMemberItems();
if (items!=null&&!items.isEmpty()) {//卡專案不為空
List<MemberItemEntity> itemsTemp=new ArrayList<MemberItemEntity>();//無用的item
for (MemberItemEntity memberItemEntity : items) {
if (memberItemEntity.getNumber()==0) {//專案數量為0
itemsTemp.add(memberItemEntity);
}else{
count=1;//數量不為0
}
}
items.removeAll(itemsTemp);//去掉數量等於0的專案
}
//items全是0次數,就找groups
List<MemberItemGroupEntity> groups=memberCardEntity.getMemberItemGroups();
if (groups!=null&&!groups.isEmpty()) {//分組專案不為空
List<MemberItemGroupEntity> groupsTemp=new ArrayList<MemberItemGroupEntity>();
for (MemberItemGroupEntity memberItemGroupEntity : groups) {
if (memberItemGroupEntity.getNumber()==0) {
groupsTemp.add(memberItemGroupEntity);
}else{
count=1;//數量不為0
}
}
groups.removeAll(groupsTemp);//去掉數量等於0的分組專案
}
if(count==1){
cards.add(memberCardEntity);
}
}
}


for (MemberCardEntity memberCardEntity : memberCards ) {
String memberCardType=memberCardEntity.getType();
if("5".equals(memberCardType)){//型別為時限卡
memberCardEntity.setType("時限卡");
}
if("1".equals(memberCardType)){
memberCardEntity.setType("套餐卡");
}
if("2".equals(memberCardType)){
memberCardEntity.setType("療程卡");
}
if("3".equals(memberCardType)){
memberCardEntity.setType("自選卡");
}
if("4".equals(memberCardType)){
memberCardEntity.setType("贈送卡");
}
}

//過期的會員卡
String hqlOutDate="from MemberCardEntity where memberId='"+mid+"' and CURDATE()> deadline";
List<MemberCardEntity> cardsOutDate=new ArrayList<MemberCardEntity>();
List<MemberCardEntity> memberCardsOutDate = systemService.findByQueryString(hqlOutDate);
for (MemberCardEntity memberCardEntity : memberCardsOutDate) {
cardsOutDate.add(memberCardEntity);
}
changeMemberCardType(memberCards);
changeMemberCardType(memberCardsOutDate);
request.setAttribute("memberCards", cards);

問題在systemService.findByQueryString(hqlOutDate);

public <T> List<T> findByQueryString(String hql) {
return commonDao.findByQueryString(hql);
}

/**
* 通過hql 查詢語句查詢物件

* @param <T>
* @param query
* @return
*/
public List<T> findByQueryString(final String query) {
Query queryObject = getSession().createQuery(query);
List<T> list = queryObject.list();//這裡有快取的,如果上一次查詢的list改變後,第二次查詢會先把上一次改變後的結果先更新到資料庫,再查詢。
if (list.size() > 0) {
getSession().flush();
}
return list;
}

由於第一次查詢得到的list,然後我們修改了物件的值,第二次查詢時,會先更新list到資料庫,再執行查詢操作