####官网API
http://docs.spring.io/spring-data/jpa/docs/current/reference/html/
####spring data jpa接口结构图
Repository:顶级接口,提供组建扫描
-|CrudRepository:提供增删改查功能
-|PagingAndSortingRepository:分页排序功能
-|JpaRepository:增加批量操作功能
JpaSpecificationExecutor:复杂查询接口
Pageable:分页接口
-|PageRequest:分页实现类
####基于Repository接口的条件查询,分页,排序
// 两个方式一致
@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高级查询
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与@基于实体类上NamedQuery
// 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();
####查询限定词