带下划线的 findBy 和不带下划线的 findBy 有什么区别?

时间:2021-06-17 11:26:19

标签: mysql spring-boot spring-data-jpa backend

示例:有什么区别:

List<UserCompany> findByCompany_IdAndCompany_IsActivated(params)
   and 
List<UserCompany> findByCompanyIdAndCompanyIsActivated(params)

2 个答案:

答案 0 :(得分:0)

下划线是保留字符,它允许您指向正确的对象来构造 jpa 查询。它仅用于嵌套对象。例如,如果您想通过 Company 对象内的 Address 内的 ZipCode 进行查询。

更多信息可以在here

答案 1 :(得分:0)

如果您的模型在字段名称方面没有歧义,则没有区别。

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) 解释为属性和 检查具有该名称(未大写)的属性的域类。 如果算法成功,它将使用该属性。如果不是,算法 将骆驼箱部分的源从右侧拆分为 一个头和一个尾,并试图找到相应的属性,在我们的 例如,地址邮编和代码。如果算法找到一个属性 那个头它需要尾巴并继续建造树 在那里,以刚刚描述的方式将尾巴分开。如果第一个 分割不匹配,算法将分割点向左移动 (地址,邮政编码)并继续。

虽然这应该适用于大多数情况,但对于 算法来选择错误的属性。假设 Person 类有 还有一个 addressZip 属性。该算法将在第一个匹配 已经拆分回合并且基本上选择了错误的属性并且 最终失败(因为 addressZip 的类型可能没有代码 财产)。要解决这种歧义,您可以在方法中使用 _ name 手动定义遍历点。所以我们的方法名称将结束 像这样:

列出 findByAddress_ZipCode(ZipCode zipCode);