Spring Data Repository Query Method 源码简析

Stella981
• 阅读 572

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 这些技术。

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