请问使用spring-data的自定义条件分页查询时,如何加入缓存?

西秦月影 2019-10-09 01:54:56
我用的是spring-boot+spring-data(hibernate-jpa),如果用jpa默认的findAll分页方法是没问题的,直接在方法上加入缓存注解即可。
@Cacheable(cacheNames = "xqblog")
Page<XqBlog> findAll(Pageable pageable);


但是现在我还有一个方法是包含条件查询的分页,具体代码如下:

Page<XqBlog> objPage = xqBlogDao.findAll(new Specification<XqBlog>()
{
@Override
public Predicate toPredicate(Root<XqBlog> root,
CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder)
{
List<Predicate> lstPredicates = new ArrayList<Predicate>();

String typeStr = typeId;
if(StringUtils.isNotBlank(typeStr))
{
request.getSession().setAttribute("nowTypeId", typeStr);
}

Object nowTypeIdObj = request.getSession().getAttribute("nowTypeId");
if(nowTypeIdObj != null)
{
typeStr = nowTypeIdObj+"";
}

// 是否根据文章标题进行条件查询
if (StringUtils.isNotBlank(search) && !search.equals("null") && !search.equals("undefined"))
{
request.setAttribute("search", search);
request.getSession().setAttribute("search", search);
lstPredicates.add(criteriaBuilder.like(root.get("title").as(String.class), "%" + search + "%"));
}
else
{
request.getSession().setAttribute("search", null);
}

if (typeStr!=null && !typeStr.equals("0"))
{
request.getSession().setAttribute("nowTypeId", typeStr);

//级联查询:使用root对象的join制定要关联的对象实体
Join<XqBlog, XqBlogType> join = root.join("blogType");
Path<String> exp3 = join.get("typeId");
lstPredicates.add(criteriaBuilder.equal(exp3, typeStr));
}
else
{
request.getSession().setAttribute("nowTypeId", 0);
}
Predicate[] arrayPredicates = new Predicate[lstPredicates.size()];
return criteriaBuilder.and(lstPredicates.toArray(arrayPredicates));
}
}, pageable);


这时候缓存注解是没法直接放到内部方法的xqBlogDao.findAll()上的,请问这种情况下怎样实现缓存查询?谢谢!
...全文
103 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧