【问题标题】:Spring Data JPA query generation by field按字段生成 Spring Data JPA 查询
【发布时间】:2016-01-12 09:09:27
【问题描述】:

我在 ProjectRepository 中有一个方法,看起来像这样:

findByUserID(int userID);

这将列出引用某个用户的所有项目。由于其他要求,我现在需要从项目中引用用户,而不仅仅是用户 ID,如下所示:

@ManyToOne
@JoinColumn(name = "userID", referencedColumnName = "userID")
private User user;

过去只是:

int userID;

所以我将方法替换为:

findByUser(User user);

但这需要额外调用数据库来获取给定用户 ID 的用户对象。有没有办法在我的新课程中使用第一种方法?如果我只保留第一种方法,我会得到一个

org.springframework.data.mapping.PropertyReferenceException: No property ID found for type User! Traversed path: Project.user.

如果不编写自定义查询,这可能吗?

【问题讨论】:

  • User 的 ID 属性名称是什么?
  • 我所有的ID都使用约定:classNameID;例如用户 ID

标签: java spring jpa spring-data


【解决方案1】:

假设User类包含定义为:

public class User {
    private int userId;

    public User(int userId) {
        this.userId = userId;
    }
    //getters setters ommitted
}

并且 Project 类中有一个 User 对象,如下所示:

public class Project {
    private User user;

    public Project() {
    }
    //rest ommitted
}

它应该根据文档能够在存储库中编写自定义查询,通过编写访问像 project.user.userId 这样的嵌套属性

findByUserUserId(int userId);

或者至少这是我阅读文档here时所理解的

【讨论】:

  • 是的,自定义查询可能是要走的路。但我正在寻找无需编写查询的解决方案。我将 Spring 的查询创建(和 Hibernate)用于所有其他数据库操作,因此我有兴趣学习更复杂的方法名称。我在文档中找不到任何内容...
  • 上述解决方案不是使用查询创建吗?我都是这样做的。它更快而且很酷。 findByLastNameEqualsIgnoreCase(String lastName) 喜欢那种风格对吗?这就是查询创建的意思吗?因为这就是 findByUserUserId(int userId) 正在做的事情。理论上它应该自动生成一个查询 select * from project where project.user.userId = :userId
  • 对不起,我一定是看错了你的答案!我会立即尝试您的解决方案。编辑:这正是我想要的,谢谢!!
【解决方案2】:

尝试使用@PrimaryKeyJoinColumn 注释。

【讨论】:

  • 我把它放在哪里?如果我把它放在我的用户类中并更新我的存储库,我仍然会得到一个 PropertyReferenceException: No property ID found for type User
猜你喜欢
  • 2019-02-20
  • 2015-01-30
  • 2022-01-23
  • 2017-11-28
  • 1970-01-01
  • 2016-08-31
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多