//查询id值最大的那个person
//使用@Query注解可以自定义JPQL语句,语句可以实现更灵活的查询
@Query("SELECT p FROM Person p WHERE p.id=(SELECT max(p2.id) FROM Person p2)")
Person getMaxIdPerson();
//为@Query注解传递参数的方式1:使用占位符
@Query("SELECT P FROM Person P where P.lastName=?1 AND P.email=?2")
List<Person> testQueryAnnotationParams1(String lastName,String email);
//为@Query注解传递参数的方式2:使用命名参数方式
@Query("SELECT P FROM Person P where P.lastName=:lastName AND P.email=:email")
List<Person> testQueryAnnotationParams2(@Param("email")String email,@Param("lastName")String lastName);
//Spring Data 运行在占位符上添加%%
@Query("select p from Person p where p.lastName like %?1% or p.email like %?2%")
List<Person> testQueryAnnotationLikeParam(String lastName,String email);
//设置nativeQuery=true 可以使用原生的sql查询
@Query(value="SELECT count(id) FROM jpa_persons",nativeQuery=true)
public long getTotalCount();
//可以通过自定义的JPQL 完成update和delete操作,注意:JPQL不支持Insert操作
//在@Query注解中编写JPQL语句,但必须使用@Modify进行修饰,以通知SpringData,这是一个Update或者Delete
//Update或者delete操作,需要使用事务,此时需要定义Service层,在service层的方法上添加事务操作
//默认情况下,SpringData的每个方法上有事务,但都是一个只读事务,他们不能完成修改操作
@Modifying
@Query("update Person p set p.email=:email where id=:id")
void updatePersonEmail(@Param("id")Integer id,@Param("email")String email);
@Test
public void testModifing(){
// personRepotory.updatePersonEmail(1, "@@qq.com");
personService.updatePersonEmail("aa@aa", 1);
}
@Test
public void testQueryLikeAnnotationParam(){
List<Person> persons=personRepotory.testQueryAnnotationLikeParam("%AA%", "%b%");
System.out.println(persons);
long count=personRepotory.getTotalCount();
System.out.println(count);
}
@Test
public void HelloWorldSpringData(){
PersonRepotory personRepotory=ctx.getBean(PersonRepotory.class);
System.out.println(personRepotory.getClass().getName());
Person person=personRepotory.getByLastName("AA");
System.out.println(person);
}
@Test
public void testCrudRepository()
{
List<Person> persons=new ArrayList<Person>();
for (int i = 1; i < 10000; i++) {
Person person=new Person();
person.setBirth(new Date());
person.setEmail("@2"+i+" com");
persons.add(person);
}
long startTime=System.currentTimeMillis();
personService.savePersons(persons);
long endTime=System.currentTimeMillis();
System.out.println((endTime-startTime)/1000);
}
@Test
public void testPagingAndSortingRespository(){
//pageNumber是从0开始的
int pageNumber=4;
int pageSize=5;
//PageAble 接口通常用的是PageRequest实现类,其中封装了需要分页的信息
//排序相关的,sor封装了排序的信息
Order order1=new Order(Direction.DESC, "id");
Order order2=new Order(Direction.DESC, "email");
Sort sort=new Sort(order1,order2);
•这种查询可以声明在 Repository方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是Springdata 的特有实现。
//查询id值最大的那个person
//使用@Query注解可以自定义JPQL语句,语句可以实现更灵活的查询
@Query("SELECT p FROM Person p WHERE p.id=(SELECT max(p2.id) FROM Person p2)")
Person getMaxIdPerson();
//可以通过自定义的JPQL 完成update和delete操作,注意:JPQL不支持Insert操作
//在@Query注解中编写JPQL语句,但必须使用@Modify进行修饰,以通知SpringData,这是一个Update或者Delete
//Update或者delete操作,需要使用事务,此时需要定义Service层,在service层的方法上添加事务操作
//默认情况下,SpringData的每个方法上有事务,但都是一个只读事务,他们不能完成修改操作
@Modifying
@Query("update Person p set p.email=:email where id=:id")
void updatePersonEmail(@Param("id")Integer id,@Param("email")String email);