1.JpaRepository支持接口规范方法名查询。意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现,目前支持的关键字如下。

Keyword

Sample

JPQL snippet

IsNotNull

findByAgeNotNull

...  where x.age not null

Like

findByNameLike

...  where x.name like ?1

NotLike

findByNameNotLike

...  where x.name not like ?1

StartingWith

findByNameStartingWith

...  where x.name like ?1(parameter bound with appended %)

EndingWith

findByNameEndingWith

...  where x.name like ?1(parameter bound with prepended %)

Containing

findByNameContaining

...  where x.name like ?1(parameter bound wrapped in %)

OrderBy

findByAgeOrderByName

...  where x.age = ?1 order by x.name desc

Not

findByNameNot

...  where x.name <> ?1

In

findByAgeIn

...  where x.age in ?1

NotIn

findByAgeNotIn

...  where x.age not in ?1

True

findByActiveTrue

...  where x.avtive = true

Flase

findByActiveFalse

...  where x.active = false

And

findByNameAndAge

...  where x.name = ?1 and x.age = ?2

Or

findByNameOrAge

...  where x.name = ?1 or x.age = ?2

Between

findBtAgeBetween

...  where x.age between ?1 and ?2

LessThan

findByAgeLessThan

...  where x.age  <  ?1

GreaterThan

findByAgeGreaterThan

...  where x.age > ?1

After/Before

...

...

IsNull

findByAgeIsNull

...  where x.age is null

2.JpaRepository相关查询功能

a.Spring DataJPA框架在进行方法名解析时,会先把方法名多余的前缀截取掉,比如find、findBy、read、readBy、get、getBy,然后对剩下部分进行解析。

b.假如创建如下的查询:findByUserDepUuid(),框架在解析该方法时,首先剔除

findBy,然后对剩下的属性进行解析,假设查询实体为Doc。

1:先判断userDepUuid (根据POJO规范,首字母变为小写)是否为查询实体的一个

属性,如果是,则表示根据该属性进行查询;如果没有该属性,继续第二步;

2:从右往左截取第一个大写字母开头的字符串此处为Uuid),然后检查剩下的字符串是

否为查询实体的一个属性,如果是,则表示根据该属性进行查询;如果没有该属性,

则重复第二步,继续从右往左截取;最后假设user为查询实体的一个属性;

3:接着处理剩下部分(DepUuid),先判断user所对应的类型是否有depUuid属性,如

果有,则表示该方法最终是根据“Doc.user.depUuid” 的取值进行查询;否则继

续按照步骤2的规则从右往左截取,最终表示根据“Doc.user.dep.uuid” 的值进

行查询。

4:可能会存在一种特殊情况,比如Doc包含一个user的属性,也有一个userDep 属

性,此时会存在混淆。可以明确在属性之间加上"_"以显式表达意图,比如

"findByUser_DepUuid()"或者"findByUserDep_uuid()"

c.特殊的参数: 还可以直接在方法的参数上加入分页或排序的参数,比如:

Page<UserModel>findByName(String name, Pageable pageable);

List<UserModel>findByName(String name, Sort sort);

d.也可以使用JPA的NamedQueries,方法如下:

1:在实体类上使用@NamedQuery,示例如下:

@NamedQuery(name ="UserModel.findByAge",query = "select o from UserModel

o where o.age >=?1")

2:在自己实现的DAO的Repository接口里面定义一个同名的方法,示例如下:

publicList<UserModel> findByAge(int age);

3:然后就可以使用了,Spring会先找是否有同名的NamedQuery,如果有,那么就不

会按照接口定义的方法来解析。

e.还可以使用@Query来指定本地查询,只要设置nativeQuery为true,比如:

@Query(value="select* from tbl_user where name like %?1" ,nativeQuery=true)

publicList<UserModel> findByUuidOrAge(String name);

注意:当前版本的本地查询不支持翻页和动态的排序

f.使用命名化参数,使用@Param即可,比如:

@Query(value="selecto from UserModel o where o.name like %:nn")

publicList<UserModel> findByUuidOrAge(@Param("nn") String name);

g.同样支持更新类的Query语句,添加@Modifying即可,比如:

@Modifying

@Query(value="updateUserModel o set o.name=:newName where o.name like %:nn")

public intfindByUuidOrAge(@Param("nn") String name,@Param("newName")String

newName);

注意:

1:方法的返回值应该是int,表示更新语句所影响的行数

2:在调用的地方必须加事务,没有事务不能正常执行

f.创建查询的顺序

Spring Data JPA在为接口创建代理对象时,如果发现同时存在多种上述

情况可用,它该优先采用哪种策略呢?

<jpa:repositories>提供了query-lookup-strategy 属性,用以指定查

找的顺序。它有如下三个取值:

1:create-if-not-found:如果方法通过@Query指定了查询语句,则使用该语句实现

查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该

命名查询;如果两者都没有找到,则通过解析方法名字来创建查询。这是querylookup-

strategy 属性的默认值

2:create:通过解析方法名字来创建查询。即使有符合的命名查询,或者方法通过

@Query指定的查询语句,都将会被忽略

3:use-declared-query:如果方法通过@Query指定了查询语句,则使用该语句实现

查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该

命名查询;如果两者都没有找到,则抛出异常

JpaRepository 查询规范的更多相关文章

  1. Atitit 数据库视图与表的wrap与层级查询规范

    Atitit 数据库视图与表的wrap与层级查询规范 1.1. Join层..连接各个表,以及显示各个底层字段1 1.2. 统计层1 1.3. 格式化层1 1.1. Join层..连接各个表,以及显示 ...

  2. 一步一步学SpringDataJpa——JpaRepository查询功能

    原文地址: https://blog.csdn.net/ming070423/article/details/22086169 1.JpaRepository支持接口规范方法名查询.意思是如果在接口中 ...

  3. SpringDataJpa——JpaRepository查询功能(转)

    1.JpaRepository支持接口规范方法名查询.意思是如果在接口中定义的查询方法符合它的命名规则,就可以不用写实现,目前支持的关键字如下. Keyword Sample JPQL snippet ...

  4. Spring Hibernate JPA 联表查询 复杂查询(转)

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  5. Spring Hibernate JPA 联表查询 复杂查询

    今天刷网,才发现: 1)如果想用hibernate注解,是不是一定会用到jpa的? 是.如果hibernate认为jpa的注解够用,就直接用.否则会弄一个自己的出来作为补充. 2)jpa和hibern ...

  6. JpaRepository 增删改查

    Jpa查询 JpaRepository简单查询 基本查询也分为两种,一种是spring data默认已经实现,一种是根据查询的方法来自动解析成SQL. 预先生成方法 spring data jpa 默 ...

  7. (4.9)SQL Server 数据库规范

    SQL Server 数据库规范 一.       命名规范 常用对象命名规范,使用帕斯卡命名法(Pascal,单词首字母大写),统一使用英文. 1.        表.英文单数名词,尽量写完整单词名 ...

  8. 3GPP规范命名规则解读

    http://blog.sina.com.cn/s/blog_6b10255301012co6.html 学习了解电信技术知识的一个很好的手段是阅读3GPP的规范.但是3GPP有大量的规范,我们可能经 ...

  9. [转]SQL Server 数据库规范

    SQL Server 数据库规范 一. 命名规范常用对象命名规范,使用帕斯卡命名法(Pascal,单词首字母大写),统一使用英文. 1. 表.英文单数名词,尽量写完整单词名称一般不超过3个英文单词都可 ...

随机推荐

  1. 用idea搭建一个简单的SSM的Demo

    1.新建一个maven  web app项目 结构如下 resources的资源文件如下 applicationContext.xml 的配置 <?xml version="1.0&q ...

  2. vue记事1

    1.组件引入css. 例:test.vue引入swiper.min.css | -- src |  | -- components | | -- test |  | -- test.vue | | - ...

  3. JavaScript设计模式-22.观察者模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. KNN理解

    基本思想 K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中.如下面的图: 通俗一点来说,就是找最 ...

  5. CSS选择器详解(二)通用选择器和高级选择器

    目录 通用选择器 高级选择器 子选择器 相邻兄弟选择器 属性选择器 通用选择器 通用选择器可以选择页面上的所有元素,并对它们应用样式,用 * 来表示. 语法: * { property1: value ...

  6. R语言变量赋值

    变量可以使用向左,向右且等于操作符来分配值.可以使用 print() 或 cat() 函数打印变量的值.cat() 函数将多个项目并成连续并打印输出. # Assignment using equal ...

  7. A/B_test改变新旧网页 观察用户的引流效果

    代码处:https://github.com/xubin97/Data-analysis_exp2 分析A/B测试结果 目录 简介 I - 概率 II - A/B 测试 简介 首先这个项目数据来自某公 ...

  8. Java泛型的基本使用

    Java1.5版本推出了泛型,虽然这层语法糖给开发人员带来了代码复用性方面的提升,但是这不过是编译器所做的一层语法糖,在真正生成的字节码中,这类信息却被擦除了.笔者发现很多几年开发经验的程序员,依然不 ...

  9. [译]用R语言做挖掘数据《二》

    数据探索 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到程序: ...

  10. 基于ASP.NET Core 创建 Web API

    使用 Visual Studio 创建项目. 文件->新建->项目,选择创建 ASP.NET Core Web 应用程序. 基于 ASP.NET Core 2.0 ,选择API,身份验证选 ...