Spring Data Repository Query Method 源码简析

Stella981
• 阅读 446

Spring Data 引入了一个 Repository Query Method 机制。使用者只需要定义一个接口,按照一定的格式声明方法,即可实现一定的查询功能。

例如:

interface PersonRepository extends Repository<Person, Long> {
  List<Person> findByLastname(String lastname);
}

除了 JPA,Mongo 也支持这种用法。下面以 Spring Data Mongo 为例,简单解释一下其中涉及到的源代码。

Repository 查询方法的解析是在 MongoRepositoryFactoryRepositoryQuery resolveQuery(Method, RepositoryMetadata, NamedQueries) 方法中实现的。这个方法会将 Repository 接口中定义的查询方法做解析,解析为 RepositoryQuery 类型的一个对象。这里用到了策略模式,根据不同的配置,使用如 JPA、MongoDB 等不同的策略解析查询方法。MongoDB 对应的策略是 MongoQueryLookupStrategy。解析完成之后,相应的 RepositoryQuery 会存储在 RepositoryFactorySupport 中的一个 ConcurrentHashMap 中,key 为查询方法名。然后通过 AOP 拦截响应的方法调用。然后在 AbstractMongoQuery 中的 execute 方法中做具体的查询动作。

里面用到的技术并复杂,其实就是反射、正则表达式、AOP 这些技术。

点赞
收藏
评论区
推荐文章
kenx kenx
2年前
个人博客开发之blog-api项目统一结果集api封装
前言由于返回jsonapi格式接口,所以我们需要通过javabean封装一个统一数据返回格式,便于和前端约定交互,状态码枚举ResultCodejavapackagecn.soboys.core.ret;importlombok.Getter;/@authorkenx@version1.0@date2021/6/1715:35
Stella981 Stella981
2年前
List的Select 和Select().tolist()
List<PersondelpnewList<Person{newPerson{Id1,Name"小明1",Age11,Sign0},newPerson{Id2,Name"小明2",Age12,
Easter79 Easter79
2年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
mysql 工具
mysql增加慢日志vim my.conf\超过1s的查询会记录到日志文件中long\_query\_time1logslowqueries/data/var/mysql\_slow.log\记录没用索引的查询logqueriesnotusinginde
Stella981 Stella981
2年前
Lombok插件,编写简略风格Java代码神器
偶然机会在某大神博客看到写的类,不需要getset方法。只需要一个@Data注释即可,它能够在我们编译源码的时候自动帮我们生成这些方法。当然,这只是其中一个功能而已@DatapublicclassLombokTest{privateStringname;privateStringse
Stella981 Stella981
2年前
MongoDB 整合spring
SpringData提供了repository抽象方式,可以极大的减少数据访问层千篇一律的类似的重复的代码。基本DAO都会实现,find,findAll,findById,save,delete,update等方法,而且代码逻辑基本一致。SpringData提供了简化方法,通过接口定义SpringData通过Proxy自动提供具体的实现。
Wesley13 Wesley13
2年前
Mysql 表分区分类
针对Mysql数据库,表分区类型简析。【1】表分区类型(1)Range分区:按范围分区。按列值的范围区间进行分区存储;比如:id小于10存储在一个分区;id大于10小于20存储在另外一个分区;(2)List分区:按离散值集合分区。与range分区类似,不过它是按离散值进行分区。(3)Hash分区:按hash算法结果分区。对用户定义的表达式所返
Stella981 Stella981
2年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_