当实体具有关联实体id的getter时,Spring JPA派生查询

k5ifujac  于 2023-11-16  发布在  Spring
关注(0)|答案(1)|浏览(151)

我有两个实体

@Entity
public class Post{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;
}

@Entity
public class User{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long id;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Post> posts= new ArrayList<>();
}

字符串
还有一个储存库

@Repository
public interface PostRepository extends JpaRepository<Post, Long> {
  List<Post> findAllByUserId(Long id);
}


但是当我需要获取id Post.user.id时,我向类Post添加了一个方法,

public Long getUserId(){
        return user== null ? null : user.getId();
    }


然后方法findAllByUserId停止工作(IllegalArgumentException:Unable to locate Attribute with the given name UserId).有没有办法克服这个错误?或者有没有更方便的方法来获取相关实体的ID?
1.我尝试在getUserId方法上添加注解@Transient,但没有帮助
1.我知道我可以使用一个方法findAllByUser(Useruser),但是我更感兴趣的是通过id获取实体
1.我知道我可以使用@Query,但这太冗长了
1.我发现的唯一方法是重命名方法,例如调用它_getUserId,但也许还有其他方法?

oxalkeyp

oxalkeyp1#

我假设您希望获取用户(给定用户ID)发布的帖子。
1.我知道我可以使用一个方法findAllByUser(Useruser),但是我更感兴趣的是通过id获取实体
我建议您从Post中删除方法getUserId()
尽管Post中没有方法getUserId()List<Post> findAllByUserId(Long id);仍然可以工作。
您也可以将其重命名为List<Post> findAllByUser_Id(Long id);,以突出显示Id来自实体User
关于spring如何做的更多信息,最好参考spring data jpa的文档。

相关问题