【问题标题】: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);

    【讨论】:

      最近更新 更多