hibernate Query list()的缓存问题

本文探讨了在使用Hibernate时,Query的list()方法遇到的缓存问题。当查询列表后修改对象,再次查询时,Hibernate会先更新之前修改的数据到数据库,导致不期望的行为。解决方案在于理解并正确管理Hibernate的缓存机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码

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到数据库,再执行查询操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值