####官网APIhtml
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
####spring data jpa接口结构图spring
Repository:顶级接口,提供组建扫描 -|CrudRepository:提供增删改查功能 -|PagingAndSortingRepository:分页排序功能 -|JpaRepository:增长批量操做功能 JpaSpecificationExecutor:复杂查询接口 Pageable:分页接口 -|PageRequest:分页实现类
####基于Repository接口的条件查询,分页,排序sql
// 两个方式一致 @RepositoryDefinition(domainClass = Staff.class, idClass = Long.class) public interface StaffDao implements JpaRepository<Staff, Long> // 基于方法名解析 findByName select * from table t where t.name = ? // 方法名构造方法 find + 全局修饰 + By + 实体属性名称 + 限定词 + 链接词 + ...(其余属性) + OrderBy + 排序属性 + 排序方向 全局修饰:Distinct(惟一)、Top(头多少条)、First(头多少条) 限定词:IsNull、IsNotNull、Like、NotLike、Containing(%?%)、in、NotIn、IgnoreCase、Between、Equals、LessThan、GreaterThan、After、Befor... 链接词:And、Or 排序方向:ASC、DESC 全局修饰: // Enables the distinct flag for the query List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname); List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname); User findFirstByOrderByLastnameAsc(); User findTopByOrderByAgeDesc(); Page<User> queryFirst10ByLastname(String lastname, Pageable pageable); Slice<User> findTop3ByLastname(String lastname, Pageable pageable); List<User> findFirst10ByLastname(String lastname, Sort sort); List<User> findTop10ByLastname(String lastname, Pageable pageable); // 嵌套实体方法命名规则 构词法:主实体中子实体的名称 + _ + 子实体的属性名称 Ex:List<Person> findByAddress_ZipCode(ZipCode zipCode); 表示查询全部Address的zipCode为指定值的全部Person // 分页 jpa中,repository方法传入new PageRequest(page, pageSize); // 排序 List<Order> orders = new ArrayList<Order>(); Order order = new Order(Direction.ASC, "id"); jpa中,repository方法传入new Sort(Direction.ASC, "id"); new Sort(new Order()); new Sort(order); new Sort(orders); // JpaRepository直接使接口(计算字段isAudit为固定值的条数) Long countByIsAudit(Integer isAudit);
####JpaSpecificationExecutor高级查询dom
findAll(new Specification<T>(){ // Predicate查询条件,组合查询条件 @Override public Predicate toPredicate(Root<T> root, CriteriaQuery<T> cq, CriteriaBuilder cb){ // 查询名称中有"王"字的用户 // 从root中获取字段,并进行数据类型转换 Predicate nameLike = cb.like(root.get("name").as(String.class), "%王%"); return nameLike; // 集合方式 List<Predicate> predicateList = new ArrayList<Predicate>(); PredicateList.add(cb.like(root.get("name").as(String.class), "%王%")); return cq.where(predicateList.toArray(new Predicate[predicateList.size()])).getRestriction(); } });
####基于Repository接口的方法注解查询@Query与@基于实体类上NamedQueryide
// value可填JPQL或者nativeSQL // nativeQuery = true 表明用原生态sql进行编译查询 @Query(value = "SELECT u FROM User t WHERE t.name = :name", nativeQuery = true) List<User> findUserByName(@Param("name") String name); // 实体类添加注解 @NamedQuery(name="findUserByName", query="SELECT u FROM User u WHERE u.name=:name") @NamedQueries({ // 这里能够多个@NamedQuery }) // Dao实现类,注入EntityManager; Query query = entityManager.createNameQuery("findUserByName"); query.setParameter("name", "隔壁老王"); List<User> list = query.getResulLlist();
####查询限定词ui