使用 spring jpa开发有段时间了,总体感觉是
开发简单,但是不够灵活.
比如是根据某个字段查询,直接写findBy字段 名称的语法就可以了,相比mybatis还需要写一个 example对象,然后创建 criteria, 这样省去了很多时间.
但是不够灵活,比如联表查询.
在查询时,通常需要同时根据多个属性进行查询,且查询的条件也格式各样(大于某个值、在某个范围等等),Spring Data JPA 为此提供了一些表达条件查询的关键字,大致如下:
And --- 等价于 SQL 中的 and 关键字,比如 findByUsernameAndPassword(String user, Striang pwd);
Or --- 等价于 SQL 中的 or 关键字,比如 findByUsernameOrAddress(String user, String addr);
Between --- 等价于 SQL 中的 between 关键字,比如 findBySalaryBetween(int max, int min);
LessThan --- 等价于 SQL 中的 "<",比如 findBySalaryLessThan(int max);
GreaterThan --- 等价于 SQL 中的">",比如 findBySalaryGreaterThan(int min);
IsNull --- 等价于 SQL 中的 "is null",比如 findByUsernameIsNull();
IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByUsernameIsNotNull();
NotNull --- 与 IsNotNull 等价;
Like --- 等价于 SQL 中的 "like",比如 findByUsernameLike(String user);
NotLike --- 等价于 SQL 中的 "not like",比如 findByUsernameNotLike(String user);
OrderBy --- 等价于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user);
Not --- 等价于 SQL 中的 "! =",比如 findByUsernameNot(String user);
In --- 等价于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
NotIn --- 等价于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的参数可以是 Collection 类型,也可以是数组或者不定长参数;
原生sql的支持:
直接贴代码:
public interface RegUserDao extends PagingAndSortingRepository<RegUser, Integer>, JpaSpecificationExecutor<RegUser> {
/*@Modifying
@Query("update AccountInfo a set a.salary = ?1 where a.salary < ?2")
public int increaseSalary(int after, int before);*/
RegUser findByUserId(String userId);
@Query(nativeQuery = true,value = "select model_id,count(1) as num from t_reg_user where model_id is not null group by model_id ")
List<Object[]> findModelNum();
Iterable<RegUser> findByModelId(String modelId);
}
分页支持:
Map<String,Object> searchParams = new HashMap<String,Object>();
searchParams.put("EQ_jobName",jobName);
Pageable page = PageUtils.buildPageRequest(pageNumber, pageSize, sortType,"count");
Specification<CommonFriend> specification = PageUtils.buildSpecification(searchParams,CommonFriend.class);
Page<CommonFriend> pageCommonFriend = commonFriendDao.findAll(specification, page);
public class PageUtils {
/**
* 创建分页请求.
*/
public static PageRequest buildPageRequest(int pageNumber, int pageSize, String sortType,String sortColum) {
Sort sort = null;
if ("desc".equals(sortType)) {
sort = new Sort(Sort.Direction.DESC, sortColum);
} else if ("asc".equals(sortType)) {
//"count"
sort = new Sort(Sort.Direction.ASC,sortColum );
}
return new PageRequest(pageNumber - 1, pageSize, sort);
}
/**
* 创建动态查询条件组合.
*/
public static Specification buildSpecification(Map<String, Object> searchParams,Class cls) {
Map<String, SearchFilter> filters = SearchFilter.parse(searchParams);
Specification spec = DynamicSpecifications.bySearchFilter(filters.values(), cls);
return spec;
}
}