目录
Spring data Jpa基础与使用规范Jpa接口关系JpaRepository接口@Query注解1、通过JPQL2、通过SQL
JpaSpecificationExecutor接口1、单一条件查询2、多条件查询3、分页4、排序5、分页与排序
Spring data Jpa 方法规范
Spring data Jpa基础与使用规范
Jpa接口关系
JpaRepository接口
JpaRepository 接口是我们开发时使用的最多的接口。其特点是可以帮助我们将其他接口的方法的返回值做适配处理。可以使得我们在开发时更方便的使用这些方法。 dao类通过继承JpaRepository接口,方法命名只要符合jpa规范则框架会自动生成代理,无需实现类
@Repository
public interface UserDao extends JpaRepository<User,Integer> {
public Optional
<User> findById(Integer id
);
public List
<User> findByName(String name
);
}
对表的修改与插入使用save()方法即可,在执行时会先判断主键是否存在,若不存在则执行insert语句,对于已经存在的主键则执行update语句
@Query注解
1、通过JPQL
在继承了Repository接口或其子类接口后,可以使用@Query注解进行JPQL查询
public interface UsersDao extends Repository<Users, Integer> {
@Query(value
="from Users where username = ?")
List
<Users> queryUserByNameUseJPQL(String name
);
@Query("from Users where username like ?")
List
<Users> queryUserByLikeNameUseJPQL(String name
);
@Query("from Users where username = ? and userage >= ?")
List
<Users> queryUserByNameAndAge(String name
,Integer age
);
}
2、通过SQL
在JPQL的基础上将nativeQuery设置为true即可使用SQL查询,若涉及修改则还需要@Modifying注解
public interface UsersDao extends Repository<Users, Integer> {
@Query(value
="select * from t_users where username = ?",nativeQuery
=true)
List
<Users> queryUserByNameUseSQL(String name
);
@Query(value
="select * from t_users where username like ?",nativeQuery
=true)
List
<Users> queryUserByLikeNameUseSQL(String name
);
@Query(value
="select * from t_users where username = ? and userage >= ?",nativeQuery
=true)
List
<Users> queryUserByNameAndAgeUseSQL(String name
,Integer age
);
@Query("update Users set userage = ? where userid = ?")
@Modifying
void updateUserAgeById(Integer age
,Integer id
);
}
JpaSpecificationExecutor接口
JpaSpecificationExecutor接口不能单独使用,需要配合着jpa中的其他接口一起使用
public interface UsersDao extends JpaRepository<Users, Integer>,JpaSpecificationExecutor
<Users>{
}
1、单一条件查询
@Test
public void test1(){
Specification
<Users> spec
= new Specification<Users>() {
@Override
public Predicate
toPredicate(Root
<Users> root
, CriteriaQuery
<?> query
, CriteriaBuilder cb
) {
Predicate pre
= cb
.equal(root
.get("username"), "王五");
return pre
;
}
};
List
<Users> list
= usersDao
.findAll(spec
);
for (Users users
: list
) {
System
.out
.println(users
);
}
}
2、多条件查询
@Test
public void test2(){
Specification
<Users> spec
= new Specification<Users>() {
@Override
public Predicate
toPredicate(Root
<Users> root
, CriteriaQuery
<?> query
, CriteriaBuilder cb
) {
List
<Predicate> list
= new ArrayList<>();
list
.add(cb
.equal(root
.get("username"),"王五"));
list
.add(cb
.equal(root
.get("userage"),24));
Predicate
[] arr
= new Predicate[list
.size()];
return cb
.and(list
.toArray(arr
));
}
};
List
<Users> list
= usersDao
.findAll(spec
);
for (Users users
: list
) {
System
.out
.println(users
);
}
}
@Test
public void test3(){
Specification
<Users> spec
= new Specification<Users>() {
@Override
public Predicate
toPredicate(Root
<Users> root
, CriteriaQuery
<?> query
, CriteriaBuilder cb
) {
return cb
.or(cb
.equal(root
.get("username"),"王五"),cb
.equal(root
.get("userage"), 25));
}
};
List
<Users> list
= this.usersDao
.findAll(spec
);
for (Users users
: list
) {
System
.out
.println(users
);
}
}
3、分页
@Test
public void test4(){
Specification
<Users> spec
= new Specification<Users>() {
@Override
public Predicate
toPredicate(Root
<Users> root
, CriteriaQuery
<?> query
, CriteriaBuilder cb
) {
return cb
.like(root
.get("username").as(String
.class), "王%");
}
};
Pageable pageable
= PageRequest
.of(2, 2);
Page
<Users> page
= this.usersDao
.findAll(spec
, pageable
);
System
.out
.println("总条数:"+page
.getTotalElements());
System
.out
.println("总页数:"+page
.getTotalPages());
List
<Users> list
= page
.getContent();
for (Users users
: list
) {
System
.out
.println(users
);
}
}
4、排序
@Test
public void test5(){
Specification
<Users> spec
= new Specification<Users>() {
@Override
public Predicate
toPredicate(Root
<Users> root
, CriteriaQuery
<?> query
, CriteriaBuilder cb
) {
return cb
.like(root
.get("username").as(String
.class), "王%");
}
};
Sort sort
= new Sort(Direction
.DESC
,"userid");
List
<Users> list
= this.usersDao
.findAll(spec
, sort
);
for (Users users
: list
) {
System
.out
.println(users
);
}
}
5、分页与排序
@Test
public void test6(){
Sort sort
= new Sort(Direction
.DESC
,"userid");
Pageable pageable
= PageRequest
.of(2,2, sort
);
Specification
<Users> spec
= new Specification<Users>() {
@Override
public Predicate
toPredicate(Root
<Users> root
, CriteriaQuery
<?> query
, CriteriaBuilder cb
) {
return cb
.like(root
.get("username").as(String
.class), "王%");
}
};
Page
<Users> page
= this.usersDao
.findAll(spec
, pageable
);
System
.out
.println("总条数:"+page
.getTotalElements());
System
.out
.println("总页数:"+page
.getTotalPages());
List
<Users> list
= page
.getContent();
for (Users users
: list
) {
System
.out
.println(users
);
}
}
Spring data Jpa 方法规范
使用Sping data Jpa快捷开发需要遵循方法命名规范: 查询方法以 find | read | get 开头, 涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性(实体类属性)以首字母大写。