Jpa是一种规范,而Hibernate是它的一种实现
使用Jpa的一个好处是,可以更换实现而不必改动太多代码。
定义Model时,使用的是jpa的annotations,比如javax.persistence.Entity, Table, Column, OneToMany等等。但它们提供的功能基础,有时候想定义的更细一些,
难免会用到Hibernate本身的annotation。
JPA实现基本的CRUD,以及分页:
继承CRUD和PagingAndSorting基类
总结:
如果需要分页,继承
PagingAndSortingRepository
如果需要条件查询,继承
JpaSpecificationExecutor
package com.lgy.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import com.lgy.model.User;
public interface UserRepository extends JpaRepository<User, Integer>,PagingAndSortingRepository<User, Integer> {
@Query("from User u where u.name=:name")
public List<User> findByUserName(@Param("name")String userName);
}
分页DEMO:
Pageable pageable = new PageRequest(1,2); //第二页 每页2条记录
Page<User> page = userRepository.findAll(pageable);
Iterator<User> iterator = page.iterator();
while(iterator.hasNext()) {
User user = iterator.next();
System.out.println(user.getId() + "---------" + user.getName());
}
int totalPages = page.getTotalPages(); //总的页数
int number = page.getNumber(); //当前也是
long totalElements = page.getTotalElements(); //总共的个数
System.out.println(totalPages + "---------" + number + "--------" + totalElements);
排序DEMO:
Sort sort = new Sort("age");
//Pageable pageable = new PageRequest(1, 2,sort); // 第二页 每页2条记录
List<User> findAll = userRepository.findAll(sort);
Iterator<User> iterator = findAll.iterator();
while (iterator.hasNext()) {
User user = iterator.next();
System.out.println(user.toString());
}
多条件查询:
@Test
public void userFindByConditor() {
Map<String, String> map = new HashMap<String, String>();
map.put("name", "%a%");
List<User> list = userRepository.findAll(buildSpecification(map));
for (User user : list) {
System.out.println(user.toString());
}
}
/*
* 创建动态查询条件组合.
*/
private Specification<User> buildSpecification(Map<String, String> searchParams) {
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Path<String> namePath = root.get("name");
query.where(cb.like(namePath, searchParams.get("name")));
return query.getRestriction();
}
};
}
使用Jpa的一个好处是,可以更换实现而不必改动太多代码。
定义Model时,使用的是jpa的annotations,比如javax.persistence.Entity, Table, Column, OneToMany等等。但它们提供的功能基础,有时候想定义的更细一些,
难免会用到Hibernate本身的annotation。
JPA实现基本的CRUD,以及分页:
继承CRUD和PagingAndSorting基类
总结:
如果需要分页,继承
PagingAndSortingRepository
如果需要条件查询,继承
JpaSpecificationExecutor
package com.lgy.dao;
import java.util.List;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.Param;
import com.lgy.model.User;
public interface UserRepository extends JpaRepository<User, Integer>,PagingAndSortingRepository<User, Integer> {
@Query("from User u where u.name=:name")
public List<User> findByUserName(@Param("name")String userName);
}
分页DEMO:
Pageable pageable = new PageRequest(1,2); //第二页 每页2条记录
Page<User> page = userRepository.findAll(pageable);
Iterator<User> iterator = page.iterator();
while(iterator.hasNext()) {
User user = iterator.next();
System.out.println(user.getId() + "---------" + user.getName());
}
int totalPages = page.getTotalPages(); //总的页数
int number = page.getNumber(); //当前也是
long totalElements = page.getTotalElements(); //总共的个数
System.out.println(totalPages + "---------" + number + "--------" + totalElements);
排序DEMO:
Sort sort = new Sort("age");
//Pageable pageable = new PageRequest(1, 2,sort); // 第二页 每页2条记录
List<User> findAll = userRepository.findAll(sort);
Iterator<User> iterator = findAll.iterator();
while (iterator.hasNext()) {
User user = iterator.next();
System.out.println(user.toString());
}
多条件查询:
@Test
public void userFindByConditor() {
Map<String, String> map = new HashMap<String, String>();
map.put("name", "%a%");
List<User> list = userRepository.findAll(buildSpecification(map));
for (User user : list) {
System.out.println(user.toString());
}
}
/*
* 创建动态查询条件组合.
*/
private Specification<User> buildSpecification(Map<String, String> searchParams) {
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Path<String> namePath = root.get("name");
query.where(cb.like(namePath, searchParams.get("name")));
return query.getRestriction();
}
};
}