我的项目有一个AfterReturning,它对一个字段进行了过滤,但是当我本身查询带有该字段时,会导致有2个该字段的条件,从而查不到数据。我希望当查询条件有该字段时它是失效的。我想到了查询sql时写or,但不是一个完美的解决办法。我希望的结果是写一个前置过滤器或者在afterOpenSession判断操作的查询参数中是否含有该字段,有时把afterOpenSession的设置跳过
@Aspect
public class TenantFilterAspect {
@Pointcut("execution (* org.hibernate.internal.SessionFactoryImpl.SessionBuilderImpl.openSession(..))")
public void openSession() {
}
@AfterReturning(pointcut = "openSession()", returning = "session")
public void afterOpenSession(Object session) {
if (session instanceof Session) {
String tenantId = LoginHelper.getTenantId();
String dynamic = TenantHelper.getDynamic();
if (StringUtils.isNotBlank(dynamic)) {
tenantId = dynamic;
}
if (tenantId != null && !tenantId.equals("000000")) {
LoginUser loginUser = LoginHelper.getLoginUser();
List<String> subTenantIds = loginUser.getSubTenantIds();
//无子租户创建一个新的集合添加本身租户编号去过滤数据
if(subTenantIds == null)
subTenantIds = new LinkedList<>();
subTenantIds.add(tenantId);
org.hibernate.Filter filterList = ((Session) session).enableFilter("tenantListFilter");
filterList.setParameterList("tenantId", subTenantIds);
org.hibernate.Filter filter = ((Session) session).enableFilter("tenantFilter");
filter.setParameter("tenantId", tenantId);
}
}
}