当前位置: 首页 > wzjs >正文

供应链网站制作网站备案信息查询

供应链网站制作,网站备案信息查询,建筑设计网站排行榜,做网页跳转网站Spring Data 的 派生查询(Derived Query) 是一种通过 方法名约定 自动生成数据库查询的机制,无需手动编写 SQL 或 JPQL。以下是其核心原理和用法的详细解析: 一、核心机制 1. 方法名解析规则 Spring Data 根据 方法名的结构 解析…

Spring Data 的 派生查询(Derived Query) 是一种通过 方法名约定 自动生成数据库查询的机制,无需手动编写 SQL 或 JPQL。以下是其核心原理和用法的详细解析:


一、核心机制

1. 方法名解析规则

Spring Data 根据 方法名的结构 解析出查询逻辑,生成对应的数据库查询。
关键步骤

  1. 拆分方法名:以 findByexistsBydeleteBy 等关键字为分隔符,提取查询条件。
  2. 解析属性路径:将方法名中的属性名(如 name)映射到实体类的字段。
  3. 识别操作符:通过关键字(如 AndOrLessThan)确定查询条件的关系和操作。
2. 动态代理实现

接口代理:Spring Data 在运行时为 Repository 接口生成动态代理类。
查询构建:根据方法名,代理类生成对应的 Criteria 或 MongoDB 的 Query 对象。


二、方法命名规范

1. 方法前缀
前缀作用示例
findBy查询并返回结果findByName(String name)
existsBy检查是否存在记录existsByEmail(String email)
deleteBy删除符合条件的记录deleteByStatus(Status status)
countBy统计符合条件的记录数countByAgeGreaterThan(int age)
2. 条件关键字
关键字操作符示例
AndAND 连接多个条件findByNameAndAge
OrOR 连接多个条件findByNameOrEmail
Is/Equals等于 (=)findByEmailIs
LessThan小于 (<)findByAgeLessThan
Like模糊匹配 (%value%)findByNameLike
Null/NotNull字段为空/非空findByDescriptionNull
3. 特殊语法

忽略大小写findByNameIgnoreCase
排序findByOrderByNameAsc
分页findByName(String name, Pageable pageable)


三、实现原理(以 MongoDB 为例)

1. 方法名到查询的转换

假设定义方法:

fun findByModelIdAndName(modelId: ObjectId, name: String): List<ScenarioField>

生成逻辑

  1. 解析条件:ModelIdName 为实体字段。
  2. 构建查询:
    db.scenarioField.find({modelId: ObjectId("xxx"),name: "xxx"
    })
    
2. 复杂查询示例
fun existsByIdIsNotAndNameAndModelId(id: ObjectId?, name: String, modelId: ObjectId): Boolean

转换后的 MongoDB 查询

db.scenarioField.exists({name: "xxx",modelId: ObjectId("xxx"),_id: { $ne: ObjectId("xxx") }  // 当 id 非空时
})

四、高级用法

1. 嵌套属性查询

若实体包含嵌套对象 User,可查询嵌套字段:

interface UserRepository : MongoRepository<User, ObjectId> {fun findByAddressCity(city: String): List<User>
}

对应实体:

data class User(val name: String,val address: Address
)data class Address(val city: String,val street: String
)
2. 自定义返回类型

支持返回 部分字段DTO 投影

interface UserRepository : MongoRepository<User, ObjectId> {fun findNameByEmail(email: String): String
}
3. 组合注解查询

@Query 注解结合,处理复杂逻辑:

@Query("{'modelId': ?0, 'status': { \$in: ?1 }}")
fun findByModelIdAndStatusIn(modelId: ObjectId, statuses: List<Status>): List<ScenarioField>

五、最佳实践与限制

1. 适用场景

简单查询:快速实现 CRUD 操作。
动态条件:通过方法名灵活组合条件。
快速原型开发:减少样板代码。

2. 局限性

复杂查询:多表关联、聚合操作需手动编写 @Query
命名冗长:深度嵌套属性可能导致方法名过长。
性能陷阱:未优化索引时,复杂条件可能影响性能。

3. 调试技巧

开启日志:查看生成的查询语句:

logging.level.org.springframework.data.mongodb.core=DEBUG

验证方法名:确保属性名与实体字段 严格匹配


六、总结

Spring Data 的派生查询机制通过 约定优于配置 的方式,将方法名转化为数据库查询,其核心价值在于:

  1. 简化开发:减少手动编写查询的工作量。
  2. 提升可读性:方法名直接反映业务逻辑。
  3. 类型安全:编译时检查属性名合法性。

合理使用派生查询,可显著提高开发效率,但在复杂场景下需结合 @Query 或自定义实现灵活应对。

示例如下:

方法 deleteAllByModelIdexistsByIdIsNotAndNameAndModelId 详解


1. deleteAllByModelId(modelId: ObjectId)
1.1 定义依据

Spring Data 派生查询机制
基于 方法名命名规则,Spring Data MongoDB 自动解析方法名并生成对应的删除操作。
deleteAllBy:表示删除所有符合条件的文档。
ModelId:映射到实体字段 modelId,需与 ScenarioField 类中的属性名严格一致。

1.2 实现的功能

操作类型:批量删除。
查询条件:删除所有 modelId 字段等于参数值的文档。
等效 MongoDB 查询

db.scenarioField.deleteMany({ modelId: ObjectId("xxx") })
1.3 使用场景

模型级联删除:当删除一个模型(Model)时,同步清理其关联的所有场景项(ScenarioField)。
数据维护:批量清理无效或测试数据。

1.4 技术细节

方法名解析流程

1. deleteAllBy → 删除操作(对应 `deleteMany`)  
2. ModelId → 条件字段名 `modelId`  

参数类型匹配ObjectId 确保与 MongoDB 的 _id 类型兼容。
事务性:若父类或方法上有 @Transactional,操作将在一个事务中执行。


2. existsByIdIsNotAndNameAndModelId(id: ObjectId?, name:String, modelId: ObjectId): Boolean
2.1 定义依据

Spring Data 派生查询规则
通过方法名中的 条件表达式 动态生成查询逻辑:
existsBy:检查是否存在符合条件的文档(返回 true/false)。
IdIsNotid 字段不等于参数值(对应 id != {id})。
NameModelId:字段等于参数值(对应 name = {name}modelId = {modelId})。

2.2 实现的功能

操作类型:存在性检查。
查询条件

WHERE name = {name} AND modelId = {modelId} AND id != {id} (如果 id 不为空)

等效 MongoDB 查询

db.scenarioField.exists({name: "xxx",modelId: ObjectId("xxx"),_id: { $ne: ObjectId("xxx") } // 当 id 不为空时
})
2.3 使用场景

唯一性校验
新增场景项:检查同一模型下是否存在同名项(此时 idnull,条件简化为 namemodelId)。
更新场景项:确保修改后的名称不与同模型下其他项重复(排除自身 id)。

2.4 技术细节

方法名解析流程

1. existsBy → 存在性检查(对应 `count` > 0)  
2. IdIsNot → 转换为 `_id: { $ne: id }`  
3. Name → `name = {name}`  
4. ModelId → `modelId = {modelId}`  

参数处理
可空 id:若 idnullIdIsNot 条件会被忽略,查询仅基于 namemodelId
字段映射:需确保 ScenarioField 实体包含 idnamemodelId 属性,并与数据库字段匹配(默认驼峰转下划线)。
性能优化
建议在 modelIdname 上创建 复合索引,加速查询:

db.scenarioField.createIndex({ modelId: 1, name: 1 })

3. 完整代码示例与验证

3.1 实体定义
@Document(collection = "scenarioField")
data class ScenarioField(@Idval id: ObjectId? = null,val name: String,val modelId: ObjectId
)
3.2 测试用例
// 测试存在性检查(新增场景)
fun testExistsForCreate() {val modelId = ObjectId()scenarioFieldRepository.save(ScenarioField(name = "Field1", modelId = modelId))val exists = scenarioFieldRepository.existsByIdIsNotAndNameAndModelId(null, "Field1", modelId)assertTrue(exists) // 应返回 true
}// 测试存在性检查(更新场景)
fun testExistsForUpdate() {val modelId = ObjectId()val field = scenarioFieldRepository.save(ScenarioField(name = "Field1", modelId = modelId))// 尝试修改为同名val exists = scenarioFieldRepository.existsByIdIsNotAndNameAndModelId(field.id, "Field1", modelId)assertFalse(exists) // 应返回 false(仅自身匹配)
}// 测试批量删除
fun testDeleteByModelId() {val modelId = ObjectId()scenarioFieldRepository.save(ScenarioField(name = "Field1", modelId = modelId))scenarioFieldRepository.save(ScenarioField(name = "Field2", modelId = modelId))scenarioFieldRepository.deleteAllByModelId(modelId)val count = scenarioFieldRepository.countByModelId(modelId)assertEquals(0, count)
}

4. 总结

方法核心作用技术实现业务场景
deleteAllByModelId按模型ID批量删除场景项Spring Data 派生查询生成 deleteMany模型删除时清理关联数据
existsByIdIsNotAndNameAndModelId校验同一模型下名称唯一性(排除自身)动态生成 $ne 和等值条件新增/更新时防止数据重复

Spring Data 优势:通过方法名约定减少手写查询代码,提升开发效率。
注意事项
• 严格遵循命名规则,避免字段名拼写错误。
• 对高频查询字段建立索引,优化性能。
• 可空参数需在业务逻辑中处理边界条件(如 idnull 时的行为)。

http://www.dtcms.com/wzjs/348884.html

相关文章:

  • 诚信网站 互联网建站网络工程师培训一般多少钱
  • 网站开发的团队有哪些百度官方网站入口
  • 广州专业网站建设后台管理便捷域名地址查询
  • 互联网网站建设月总结大连网站seo
  • 北京天津网站建设竞价推广培训课程
  • 卫计委网站一级医院建设深圳做网站的公司
  • 用jsp做的网站源代码下载百度百科官网入口
  • seo网站概述互联网营销方法有哪些
  • 做个简单的公司网站要多少钱百度投流
  • 哪个网站做体检预约的百度软件优化排名
  • 南开集团网站建设北京seo招聘
  • 做国外网站推广上海网站制作开发
  • 个人网站取名seo托管公司
  • wordpress 段落 两格石家庄百度搜索优化
  • 网站建设与经营关键词seo排名怎么选
  • 公司如何注册网站东莞网站建设方案外包
  • wordpress seo怎么写网站seo推广优化
  • 外文网站搭建公司广东seo点击排名软件哪里好
  • 电脑网站生成手机网站新品上市怎么推广词
  • wordpress深度修改宁波受欢迎全网seo优化
  • 医院网站怎么做优化排名靠前软件开发网
  • 如何做网站产品图片近几天发生的新闻大事
  • 哪个做简历的网站比较好国内好的seo
  • 没有做icp备案的网站五合一网站建设
  • 专做正品 网站百度推广账号怎么注册
  • php+mysql网站开发全程实例 下载嘉兴seo外包公司
  • 专门做爬虫的网站不错宁波seo公司
  • 外卖小程序源码百度关键词优化排名技巧
  • 网站建设及第三方支付百度seo运营工作内容
  • 网站建设电话销售工作总结徐州seo排名收费