zoukankan      html  css  js  c++  java
  • spring-data-jpa快速入门(二)——简单查询

    一、方法名解析

      1.引言

        回顾HelloWorld项目中的dao接口

    public interface GirlRepository extends JpaRepository<Girl, Integer>{
        // 新增自定义查询方法
        List<Girl> findByAge(Integer age);
    }

        可以看到,这个接口中我们只是声明了方法而没有写实现,但是却是能用的,这便得益于JPA的方法名解析了

      2.简单条件查询

        按照 Spring Data 的规范,查询方法以 find | read | get 开头

        涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性以首字母大写

        常用的关键字如下:

    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);
    StartingWith 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 类型,也可以是数组或者不定长参数;

        完整关键字支持,查看官方文档:点击查看

        IDEA对这方面支持非常友好!写方法解析时自动有智能提示!

        示例:

    List<Girl> findByNameStartingWithAndIdLessThan(String name, Integer id);
    /**
     * 1. Repository 是一个空接口. 即是一个标记接口
     * 2. 若我们定义的接口继承了 Repository, 则该接口会被 IOC 容器识别为一个 Repository Bean.
     * 纳入到 IOC 容器中. 进而可以在该接口中定义满足一定规范的方法. 
     * 
     * 3. 实际上, 也可以通过 @RepositoryDefinition 注解来替代继承 Repository 接口
     */
    /**
     * 在 Repository 子接口中声明方法
     * 1. 不是随便声明的. 而需要符合一定的规范
     * 2. 查询方法以 find | read | get 开头
     * 3. 涉及条件查询时,条件的属性用条件关键字连接
     * 4. 要注意的是:条件属性以首字母大写。
     * 5. 支持属性的级联查询. 若当前类有符合条件的属性, 则优先使用, 而不使用级联属性. 
     * 若需要使用级联属性, 则属性之间使用 _ 进行连接. 
     */
    //@RepositoryDefinition(domainClass=Person.class,idClass=Integer.class)
    public interface PersonRepsotory extends 
        JpaRepository<Person, Integer>,
        JpaSpecificationExecutor<Person>, PersonDao{
    
        //根据 lastName 来获取对应的 Person
        Person getByLastName(String lastName);
        
        //WHERE lastName LIKE ?% AND id < ?
        List<Person> getByLastNameStartingWithAndIdLessThan(String lastName, Integer id);
        
        //WHERE lastName LIKE %? AND id < ?
        List<Person> getByLastNameEndingWithAndIdLessThan(String lastName, Integer id);
        
        //WHERE email IN (?, ?, ?) OR birth < ?
        List<Person> getByEmailInAndBirthLessThan(List<String> emails, Date birth);
        
        //WHERE a.id > ?
        List<Person> getByAddress_IdGreaterThan(Integer id);
    更多示例

      其他的关键字也是类似,可以在控制台看到打印的SQL(配置了show sql)

      当然,缺点非常明显,方法名特别特别长!这个后期会通过JPQL进行改进!

    二、自定义查询

      例如带子查询的就无法实现,这里就需要自定义SQL来进行查询了!

      参考:https://www.cnblogs.com/zj0208/p/6008627.html

  • 相关阅读:
    使用微软消息队列实现C#进程间通信(转)
    JavaScript获得页面区域大小的代码
    我的第一份外包经历及所得 (转)
    用Aptana调试JavaScript教程(转)
    NET中的消息队列
    c#线程基础之线程控制
    c#线程基础之原子操作
    sql2005分区表示例
    系统资源调用和shell32.dll简介
    Windows API入门简介
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8443042.html
Copyright © 2011-2022 走看看