Spring Data JPA按字段生成查询

4

我在一个ProjectRepository中有一个方法,大致如下:

findByUserID(int userID);

这将列出所有引用特定用户的项目。由于其他要求,现在我需要从项目中引用User,而不仅仅是userID,就像这样:

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

以前只是这样:

int userID;

所以我用以下方法替换了该方法:

findByUser(User user);

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

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

不需要编写自定义查询吗?

用户的ID属性的名称是什么? - Adam Michalik
所有我的ID都使用约定:classNameID;例如,userID。 - delucasvb
2个回答

3
假设User类被定义为:
public class User {
    private int userId;

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

项目类中有一个用户对象,代码如下:

public class Project {
    private User user;

    public Project() {
    }
    //rest ommitted
}

根据文档介绍,我们应该可以通过编写自定义查询语句来访问嵌套属性,例如project.user.userId。请参考以下格式:
findByUserUserId(int userId);

或者至少这就是我从阅读这里的文档中理解到的。

是的,自定义查询可能是解决问题的方法。但我希望不必编写查询就能找到解决方案。我在所有其他数据库操作中都使用Spring的查询创建(和Hibernate),因此我有兴趣了解更复杂的方法名称。我在文档中找不到任何信息... - delucasvb
上面的解决方案不是使用查询创建吗?我所有的Spring Boot都是这样做的。这样更快,而且很酷。像findByLastNameEqualsIgnoreCase(String lastName)那样的风格对吧?这就是您所说的查询创建吗?因为findByUserUserId(int userId)正在执行此操作。理论上,它应该自动生成一个查询 select * from project where project.user.userId = :userId。 - james_s_tayler
抱歉,我可能误读了您的回答!我立即尝试您的解决方案。编辑:这正是我一直在寻找的,谢谢!! - delucasvb

0
尝试使用@PrimaryKeyJoinColumn注解。

我应该把它放在哪里?如果我把它放在我的用户类中并更新我的存储库,我仍然会得到一个PropertyReferenceException:找不到用户类型的ID属性。 - delucasvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接