【问题标题】:What is the difference between findBy with underscore and findBy without it?带下划线的 findBy 和不带下划线的 findBy 有什么区别?
【发布时间】:2021-09-02 04:48:45
【问题描述】:
例子:有什么区别:
List<UserCompany> findByCompany_IdAndCompany_IsActivated(params)
and
List<UserCompany> findByCompanyIdAndCompanyIsActivated(params)
【问题讨论】:
标签:
mysql
spring-boot
spring-data-jpa
backend
【解决方案1】:
下划线是保留字符,它允许您指向正确的对象来构造 jpa 查询。它仅用于嵌套对象。例如,如果您想通过 Company 对象内的 Address 中的 ZipCode 进行查询。
更多信息可以找到here
【解决方案2】:
如果您的模型在字段名称方面是明确的,则没有区别。
List<UserCompany> findByCompanyIdAndCompanyIsActivated(params) -
首先认为 companyId 和 companyIsActivated 是 UserCompany 中的属性,如果失败则尝试查找它们
然后它认为 UserCompany 有一个字段 Company - 这是另一个类,并且 Company 有字段 - Id 和 IsActivated 并尝试找到它们
下面的东西在哪里
List<UserCompany> findByCompany_IdAndCompany_IsActivated(params)
直接假设 UserCompany 有一个字段 Company - 这是另一个类并且 Company 有字段 - Id 和 IsActivated 并尝试找到它们
来自 spring 文档
属性表达式:---
属性表达式只能直接引用
托管实体的属性,如前面的示例所示。在
查询创建时间,您已经确保解析的属性是
托管域类的属性。但是,您也可以定义
通过遍历嵌套属性来进行约束。假设人员有
带有邮政编码的地址。在这种情况下,方法名称为
列出 findByAddressZipCode(ZipCode zipCode);创建
属性遍历 x.address.zipCode。分辨率算法开始
将整个部分(AddressZipCode)解释为属性和
检查域类中具有该名称(未大写)的属性。
如果算法成功,它将使用该属性。如果不是,算法
将骆驼箱部分的源从右侧分成
头和尾,并试图找到相应的属性,在我们的
例如,AddressZip 和代码。如果算法找到一个属性
那头它带着尾巴,继续从下面建造树
在那里,以刚才描述的方式将尾巴分开。如果第一个
拆分不匹配,算法将拆分点向左移动
(地址,邮政编码)并继续。
虽然这应该适用于大多数情况,但也有可能
算法选择错误的属性。假设 Person 类有
addressZip 属性也是如此。该算法将在第一个匹配
已经分裂并且本质上选择了错误的属性并且
最终失败(因为 addressZip 的类型可能没有代码
财产)。要解决这种歧义,您可以在方法中使用 _
手动定义遍历点的名称。所以我们的方法名会结束
像这样:
列出 findByAddress_ZipCode(ZipCode zipCode);