Spring Boot (四十)——Jpa 之关键字定义查询及自定义查询

关键字定义查询

开发者也可以在接口中自己声明相关的方法,只需要方法名称符合规范即可,在Spring Data中,只要按照既定的规范命名方法,Spring Data Jpa就知道你想干嘛,这样就不用写SQL了,那么规范是什么呢?参考下图:
Spring Boot (四十)——Jpa 之关键字定义查询及自定义查询_第1张图片
当然,这种方法命名主要是针对查询,按照 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

你可能感兴趣的:(Spring,Boot)