JpaRepository 查询规范
来源:互联网 发布:百度数据研发部 编辑:程序博客网 时间:2024/05/17 09:03
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指定了查询语句,则使用该语句实现
查询;如果没有,则查找是否定义了符合条件的命名查询,如果找到,则使用该
命名查询;如果两者都没有找到,则抛出异常
来自 <http://blog.csdn.net/ming070423/article/details/22086169>
- JpaRepository 查询规范
- JpaRepository查询方法名规范
- JpaRepository 命名规范
- JpaRepository查询功能
- JpaRepository
- SpringDataJpa——JpaRepository查询功能
- 一步一步学SpringDataJpa——JpaRepository查询功能
- JpaRepository关于日期(不带时间)查询注意事项
- 一步一步学SpringDataJpa——JpaRepository查询功能
- jpa学习4--spring data jpa 中的JpaRepository 方法定义规范
- spring-data-JPA使用JpaRepository注解自定义SQL查询数据库多表查询
- JpaRepository,JpaSpecificationExecutor
- SpringdataJpa JpaRepository
- 在jpa的JpaRepository需要对符合主键@EmbeddedId 中的一个字段进行查询的用法
- 数据库查询规范
- sql查询语句规范
- spring boot自定义JPaRepository
- spring data 之JpaRepository,JpaSpecificationExecutor
- Python操作HBase
- Keras下的图像基本变换ImageDataGenerator参数说明
- Linux下重要命令的作用
- java的单例模式
- 区块链技术将如何变革支付方式
- JpaRepository 查询规范
- 11.7学习心得
- 你还在用fflush(stdin);清空输入缓冲区吗?
- 使用cmake
- JZOJ 5459. 【NOIP2017提高A组冲刺11.7】密室
- 如何在MacOS系统里的命令行下启动和停止mysql服务
- 360借壳上市预计市值3800亿,20个涨停板就在眼前!
- @ERROR: auth failed on module daiv rsync error: error starting client-server protocol (code 5) at ma
- 51. spring boot属性文件之多环境配置【从零开始学Spring Boot】