开发者也可以在接口中自己声明相关的方法,只需要方法名称符合规范即可,在Spring Data中,只要按照既定的规范命名方法,Spring Data Jpa就知道你想干嘛,这样就不用写SQL了,那么规范是什么呢?参考下图:
当然,这种方法命名主要是针对查询,按照 Spring Data 的规范,查询方法以 find,read, get 开头,比如:
public interface BookDao extends JpaRepository<Book,Integer> {
//查询Id大于某个值的书籍
List<Book> findBookByIdGreaterThan(Integer integer);
//查询Id小于某个值或者书籍名称中包含某个字符的书籍
List<Book> findBookByIdLessThanOrNameContaining(Integer integer,String string);
}
测试:
@Test
public void find5(){
List<Book> books = bookDao.findBookByIdGreaterThan(4);
System.out.println(books);
List<Book> books2 = bookDao.findBookByIdLessThanOrNameContaining(3, "红");
System.out.println(books2);
}
输出:
Hibernate: select book0_.id as id1_0_, book0_.author as author2_0_, book0_.name as name3_0_ from t_book book0_ where book0_.id>?
[Book{id=5, name='红楼梦', author='曹雪芹'}, Book{id=6, name='朝花夕拾', author='鲁迅'}]
Hibernate: select book0_.id as id1_0_, book0_.author as author2_0_, book0_.name as name3_0_ from t_book book0_ where book0_.id<? or book0_.name like ? escape ?
[Book{id=2, name='西游记', author='吴承恩'}, Book{id=5, name='红楼梦', author='曹雪芹'}]
但是一些特殊需求,可能并不能通过这种方式解决,例如想要查询id最大的用户,这时就需要开发者自定义查询SQL了,如上代码所示,自定义查询SQL,使用@Query注解,在注解中写自己的SQL,默认使用的查询语言不是SQL,而是JPQL,这是一种数据库平台无关的面向对象的查询语言,有点定位类似于Hibernate中的HQL,在@Query注解中设置nativeQuery属性为true则表示使用原生查询,即大伙所熟悉的SQL。
@Query(value = "select * from t_book where id=(select max(id) from t_book)",nativeQuery = true)
Book findMaxIdBook();
@Test
public void find6(){
Book books = bookDao.findMaxIdBook();
System.out.println(books);
}
输出:
Hibernate: select * from t_book where id=(select max(id) from t_book)
Book{id=6, name='朝花夕拾', author='鲁迅'}
上面代码中的只是一个很简单的查询例子,还有其他一些点,例如如果这个方法中的SQL涉及到数据操作,则需要使用@Modifying注解,涉及到事务管理就要使用@Transactional注解。
比如插入数据的方法:
@Query(value = "insert into t_book (name,author) values(?1,?2)",nativeQuery = true)
@Modifying
@Transactional
Integer addBook(String name,String author);
@Test
public void test1(){
Integer count= bookDao.addBook("狂人日记", "鲁迅");
System.out.println(count);
}
Hibernate: insert into t_book (name,author) values(?,?)
1