hibernate mysql 关联查询_hibernate 查询缓存,以及在关联表查询缓存下使用HQL,而不是sql去查询...

什么是查询缓存?

也就是如果开启了查询缓存, 在 没有使用二级缓存的情况下,会 缓存第一次查询出来的数据的id。

第二次查询的时候, 如果查询的参数和查询语句没有变化,那么就会使用 第一次查询的出来的数据id 去 查询数据库。

可以起到优化SQL, 提高性能的作用。

同时 这也一个问题,就是 如果 改了数据库内容了,那么 可能 查询出来的数据是不符合 实际情况的。

比如 关联表的数据删除了,但是  主表的数据还在,且 条件是 关联表有数据的条件,那么 在 查询缓存下,数据还是没有一点变化。

为什么 在关联表查询缓存下使用HQL,而不是sql去查询?

今天就遇到了这个问题,

比如 主表 eims_organization,  关联表 eims_organization_auth

代码:

User user=this.getCurrentUser();

StringBuilder sb = new StringBuilder();

sb.append(

" EXISTS ( select 1 from eims_organization_auth as au where au.eims_org_id={alias}.id and au.user_id='")

.append(user).append("') ");

pageBean.addCriterion(Restrictions.sqlRestriction(sb.toString()));

List list = eimsOrganizationService.list(pageBean);

return DataGridTransforms.JQGRID.transform(list);

也就是 EimsOrganization 满足的条件是 当前登录用户,且 表 eims_organization_auth 权限绑定了 EimsOrganization

出现的问题就是 , 比如 当 操作 删除绑定 EimsOrganization 管理的 eims_organization_auth 数据的时候,

上面的代码 执行的结果并没有变化。 这就没有效果了。而且 用户重新退出登录都没有用,服务器重启才有效果。

也就是 在查询缓存的情况下, 当 关联表 eims_organization_auth 数据删除的时候, 查询缓存 按理 是会被清掉的。

只是 因为 代码里面 使用了SQL 而不是HQL 导致 查询缓存 清不了。改为 HQL 之后,解决了 这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值