英文:
Spring JPA. Call @ManyToMany ONLY and not the whole object
问题
假设我有类似这样的代码:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "assigned_tasks", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "task_id", referencedColumnName = "id"))
private Set<Task> assignedTasksDoer = new HashSet<>();
在我的 "User" 实体类中。
当我获取用户时,它会将所有详细信息都带给我。这非常好,没有任何错误。
但是我如何将其拆分成多个部分,例如,当我只想从与 UserController 不同的控制器(例如 AssignedTasksController)中获取“assigned_tasks”时,我该如何做呢?
如果有人感兴趣,我愿意提供更多细节。
由于我刚开始使用面向对象的方法,请帮助我!是的,使用 JPA、实体、DAO 和存储库非常好,让 Spring 在幕后处理所有事情也很棒,但是否有局限性呢?我是否可以完全避免编写 SQL 查询和准备语句,或者在其他必须使用它们的情况下采取其他方法呢?
简而言之:User 实体还有其他字段。我希望创建一个控制器路由,仅每次获取用户的分配任务,而不是整个对象。我该如何做到这一点?
英文:
Suppose I have something like this:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "assigned_tasks", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "task_id", referencedColumnName = "id"))
private Set<Task> assignedTasksDoer = new HashSet<>();
in my "User" entity class.
When I fetch the user it brings me all the details. And that's great. No errors whatsoever.
But how can I break it apart in pieces, so for example, when I want to fetch ONLY the "assigned_tasks" OF the User I can just fetch it from a different controller other than the UserController, i.e. the AssignedTasksController?
I'm willing to provide more details if anyone is interested.
Please help me as I am starting this Object Oriented approach!! Yes, working with jpa, entities, DAOs and repositories is great, while letting Spring take care of everything under the hood, is great, but are there limitations to it? Can I completely avoid writing sql queries and prepares statements or other cases where I will have to resort to it?
TL;DR: The User entity has other fields too. I want make a controller route that only fetches the assigned tasks of the user, and not the whole object everytime. How can I do that?
答案1
得分: 1
我假设你正在使用Spring Data JPA。在这种情况下,你很可能已经有类似于UserRepository extends JpaRepository<User, Long>
(假设主键是Long类型)的东西。
只需创建一个TaskRepository extends JpaRepository<Task, Long>
,并添加以下方法:List<Task> findAllByUserId(Long userId);
到该接口中。这假设Task
有一个字段User user
,而User
的主键字段称为id
(因此有"byUserId")。
有关如何使用Spring Data仓库创建查询的更多详细信息,请参见Spring Data JPA,查询创建。
如果需要更多控制,还可以查看同一文档中的@Query
注解。
英文:
I assume you are using Spring Data JPA. In that case you most likely already have something like a UserRepository extends JpaRepositry<User, Long>
(assuming the primary key is a Long).
Just create a TaskRepository extends JpaRepository<Task, Long>
and add the following method: List<Task> findAllByUserId(Long userId);
to that interface. This assumes that Task
has a field User user
and the primary field of User
is called id
(hence the "byUserId").
See Spring Data JPA, Query Creation for more details on how to create queries using a Spring Data repository.
If you need more control, you can also take a look at the @Query
annotation in the same documentation.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论