hibernate 查詢緩存,以及在關聯表查詢緩存下使用HQL,而不是sql去查詢

什麼是查詢緩存?java

參考,https://blog.csdn.net/qq_37630354/article/details/76138749sql

https://www.jb51.net/article/123108.htm數據庫

也就是若是開啓了查詢緩存, 在 沒有使用二級緩存的狀況下,會 緩存第一次查詢出來的數據的id。緩存

第二次查詢的時候, 若是查詢的參數和查詢語句沒有變化,那麼就會使用 第一次查詢的出來的數據id 去 查詢數據庫。服務器

能夠起到優化SQL, 提升性能的做用。app

同時 這也一個問題,就是 若是 改了數據庫內容了,那麼 可能 查詢出來的數據是不符合 實際狀況的。性能

好比 關聯表的數據刪除了,可是  主表的數據還在,且 條件是 關聯表有數據的條件,那麼 在 查詢緩存下,數據仍是沒有一點變化。優化

 

爲何 在關聯表查詢緩存下使用HQL,而不是sql去查詢?ui

 

今天就遇到了這個問題, this

好比 主表 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<EimsOrganization> list = eimsOrganizationService.list(pageBean);

		return DataGridTransforms.JQGRID.transform(list);


也就是  EimsOrganization 知足的條件是 當前登陸用戶,且 表 eims_organization_auth 權限綁定了 EimsOrganization

 

出現的問題就是 , 好比 當 操做 刪除綁定 EimsOrganization 管理的 eims_organization_auth 數據的時候,

上面的代碼 執行的結果並無變化。 這就沒有效果了。並且 用戶從新退出登陸都沒有用,服務器重啓纔有效果。

也就是 在查詢緩存的狀況下, 當 關聯表 eims_organization_auth 數據刪除的時候, 查詢緩存 按理 是會被清掉的。

只是 由於 代碼裏面 使用了SQL 而不是HQL 致使 查詢緩存 清不了。改成 HQL 以後,解決了 這個問題。

相關文章
相關標籤/搜索