今天项目中需要用到多个条件关联查询,用jpa原生的查询方式实现起来就比较繁琐,但是jpa中提供了entityManger这个类可以实现自定义的sql查询这样我们就可以书写原生sql从而实现多条件的查询了实现方式也比较简单
1.注入entityManger实体类
@Autowired
private EntityManager entityManager;
2.调用entityManger.createNativeQuery()方法实现查询,在实现分页的过程中需要用org.springframework.data.domain.PageImpl;这个类他是page对象的实现类,在调用时会发现我们传入的pageable参数没有作用,那是因为pageable对象无法对我们已经查询出来的集合进行分页操作所以需要我们手动实现他的分页方法。
代码示例:
public Page<StutsDk> execQuerySqlPage(Pageable pageable, String sql) {
Query query = this.entityManager.createNativeQuery(sql,StutsDk.class);
List<StutsDk> stutsDks=query.getResultList();
if (pageable.getOffset() > stutsDks.size()) {
long total = 0L;
PageImpl<StutsDk> page = new PageImpl<>(stutsDks,pageable,total);
return page;
}
if (pageable.getOffset() <= stutsDks.size() && pageable.getOffset() + pageable.getPageSize() > stutsDks.size()) {
List<StutsDk> bizPojos = stutsDks.subList(pageable.getOffset(), stutsDks.size());
PageImpl<StutsDk> page = new PageImpl<>(bizPojos, pageable, stutsDks.size());
return page;
}
List<StutsDk> newStutsDks = stutsDks.subList(pageable.getOffset(), pageable.getOffset() + pageable.getPageSize());
PageImpl<StutsDk> page = new PageImpl<StutsDk>(newStutsDks, pageable, stutsDks.size());
return page;
}
调用createNativeQuery()方法时如果不写实体类的映射返回的会是list<Object>集合我们也可以调用query查询对象中的query.unwrap()方法将其转换为list<Map<,>>集合。
以上代码快中所调用的pageable的两个方法
pageable.getOffset()
pageable.getPageSize()
分别为获取数据的偏移量和和要返回的数据行数