【问题标题】:Spring's findByColumnName returning empty listSpring findBy Column Name 返回空列表
【发布时间】:2020-08-01 11:28:58
【问题描述】:

我需要根据名为owner 的列的值从数据库中检索Category 的列表。这是我的Category -

@Entity
@Table(name = "categories")
class Category(@Column(name = "category_id", nullable = false)
                     @Id @GeneratedValue(strategyGenerationType.AUTO)
                     var id: Long = 0,

                     @Column(name = "category_owner", nullable = false)
                     @field:NotNull(message = "Please assign an owner")
                     var owner: Long?,

                     @Column(name = "category_name", nullable = false)
                     @field:NotEmpty(message = "Please assign a name")
                     var name: String?)

这是我定义函数findByOwner的界面-

interface CategoryRepository: JpaRepository<Category, Long> {
    fun findByOwner(categoryOwner: Long): List<Category>
}

但是,当我调用该方法时,我没有得到任何响应。我已确保数据库具有正确的数据,并且我提供了正确的所有者 ID。甚至使缓存等无效。可能出了什么问题?

编辑:

spring.jpa.show-sql=true之后-

findAll()

 Hibernate: select category0_.category_id as category1_0_, category0_.category_name as category2_0_, category0_.category_owner as category3_0_ from categories category0_

findByOwner()

 Hibernate: select category0_.category_id as category1_0_, category0_.category_name as category2_0_, category0_.category_owner as category3_0_ from categories category0_ where category0_.category_owner=?

编辑 2:

事实证明,我的实现一直都很好。该错误在我的service 中。

【问题讨论】:

  • 你能做一个findAll() 并检查它是否正在返回数据并且至少一条返回的记录包含你在上述查询中使用的owner 值吗?
  • findAll() 按预期工作。
  • 这是个好消息,排除了任何基本错误。现在您可以将spring.jpa.show-sql=true 添加到您的application.properties 并告诉我为findAll 生成了哪些查询以及为findByOwner() 生成了哪些查询。您可以用结果更新问题,因为很难用结果发表评论
  • 完成。我可以看到 findByOwner() 中的 ownerId 不存在。
  • 我的想法已经用完了。除了 where 条件和 where 条件`对于第二个查询是正确的之外,两个查询都是相同的

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


【解决方案1】:

根据列名创建命名方法。

fun findByCategoryOwner(categoryOwner: Long): List<Category>

或者使用@Query

@Query("SELECT * FROM categories WHERE category_owner = ?1", nativeQuery = true)
fun findByOwner(cateogryOwner: Long): List<Category

【讨论】:

  • 第一个选项不起作用。但是,令人惊讶的是,即使是本机查询也不起作用。我现在认为问题出在其他问题上,因为当我在数据库的 GUI 工具中执行相同的本机查询时,它可以工作。
【解决方案2】:
  • 你能不能在org.springframework.data.jpa.repository.query.JpaQueryExecution类中放一个断点,当你执行findByOwner时,它会到这里。

  • 当它到达此断点时,选择query.createQuery(accessor).getResultList() 并评估以查看hibernate 返回的值以供spring-data-jpa 使用

【讨论】:

  • 非常感谢您花这么多时间来寻找解决方案。但是,事实证明该错误在我的服务中。 findBy.. 一直运行良好。问题出在其他地方。
  • 不用担心。调试是你的朋友。甚至框架都是由另一个开发人员编写的,所以调试:)
【解决方案3】:

这个post 应该可以帮助你。由于parameter name 不匹配,它似乎正在发生。

【讨论】:

    【解决方案4】:

    使用 camelCase 命名实体类中的变量,然后 jpa 将自动识别列名

    findByCategoryOwner(String categoryOwner)
    

    如果您仍希望列名中包含下划线,请尝试此操作

    findByCategory_Owner(String categoryOwner)
    

    我还没有尝试过第二个选项

    【讨论】:

    • 我尝试了第二种方式。但是,不幸的是,它不起作用。
    • 参考这个docs 它必须在 DB 中使用不同的列名和在 Entity 类中使​​用不同的属性名,IMO 都应该是相同的,以便 JPA 理解
    【解决方案5】:

    至少在java中你需要在方法名中提供id:

    **fun findByOwner_Id(categoryOwner: Long): List<Category>**
    

    所以把它从findByOwner改成-> findByOwnerId

    【讨论】:

    • 这不起作用,很遗憾。拒绝建造。
    • 我编辑了答案@krtkush。我在本地尝试过,它要求输入下划线。
    猜你喜欢
    • 2017-05-08
    • 1970-01-01
    • 2018-07-15
    • 2019-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多