版权声明:本文为博主原创文章,未经允许请勿转载,谢谢 https://blog.csdn.net/a972669015/article/details/88616195
1.继承自JpaRepository<T,ID>后,可以直接在service使用父接口的查询方法。如findOne,findById,findAll等方法进行查询一个,多个或分页查询操作
@Override
public UserAccount findUserAccountById(Long id) {
Optional<UserAccount> opt = userAccountRepository.findById(id);
return opt.get();
}
@Override
public Page<UserAccount> findAllUserAccount(Pageable pageable) {
return userAccountRepository.findAll(pageable);
}
2.根据实体类属性进行查询某个实体类,在Repository接口中建立对应的findByXXX方法(XXX为属性名称,首字母大写),不用写方法体。
UserAccount findByUserName(String username);
UserAccount findByAlertMobile(String alertMobile);
3.自己写sql语句进行自定义查询,比如根据手机号查询用户名,可以在方法上加@Query()注释,在括号里写要执行的sql,需要传入参数的字段可以用占位符:表示。
nativeQuery=true表示使用原生sql,不写的话就表示不使用原生sql,表名就是实体类名,表字段名就是实体类属性名
@Query("SELECT id FROM useraccount WHERE userName = :userName")
Long findIdByUsername(@Param("userName")String userName);
4.使用Specification进行动态查询,有时遇到的业务场景,查询条件不固定,需要进行动态查询,这时候继承自JpaRepository的方法和自己写的sql已经无法满足需求,就可以使用Specification接口,我们只需要重写toPredicate方法即可,例如:
Specification接口源代码如下:
@SuppressWarnings("deprecation")
public interface Specification<T> extends Serializable {
@Nullable
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder);
}
自定义动态查询:
持久层:findAll传入两个参数,spec设立查询条件,pageable设置分页信息。
Page<Article> findAll(Specification<Article> spec, Pageable pageable);
服务层:
@Override
public Page<Article> findAllPageByTitleAndDate((String title, Timestamp startDate, Timestamp endDate, Integer pageNumber, Integer pageSize)) {
//规格定义
Specification<Article> specification = new Specification<UserAccount>() {
private static final long serialVersionUID = 5555932480624669312L;
/**
* 构造断言
* @param root 实体对象引用
* @param query 规则查询对象
* @param cb 规则构建对象
* @return 断言
*/
@Override
public Predicate toPredicate(Root<Article> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
//Join<Article,Webonesite> join=root.join("webonesite",JoinType.INNER);
if (StringUtils.isNotBlank(title)) {
Predicate title1 = cb.like(root.get("title").as(String.class), "%" +title + "%");
predicates.add(title1);
}
if (startDate != null || endDate != null) {
Predicate publishDate = cb.between((root.get("publishDate")), startDate, endDate);
predicates.add(publishDate);
}
Predicate[] p = new Predicate[predicates.size()];
return cb.and(predicates.toArray(p));
}
};
//分页 前端从1开始,jpa从0开始
Pageable pageable = PageRequest.of(pageNumber - 1, pageSize,new Sort(Sort.Direction.ASC, "id"));
//查询
return repo.findAll(spec, pageable);
}
也可以简略写成lambda,里面写toPredicate的方法体:
Specification<Article> spec = (Specification<Article>) (root, query, cb) -> {
};