【问题标题】:Spring JPA. Call @ManyToMany ONLY and not the whole object春季 JPA。仅调用 @ManyToMany 而不是整个对象
【发布时间】:2020-08-15 05:20:22
【问题描述】:

假设我有这样的事情:

   @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<>();

在我的“用户”实体类中。

当我获取用户时,它会带给我所有详细信息。这很棒。没有任何错误。 但是我怎样才能将它分成几部分,例如,当我只想获取用户的“assigned_tasks”时,我可以从 UserController 以外的其他控制器(即 AssignedTasksController)中获取它?

如果有人感兴趣,我愿意提供更多细节。

请帮助我,因为我正在开始这种面向对象的方法!是的,与 jpa、实体、DAO 和存储库一起工作很棒,同时让 Spring 处理引擎盖下的所有事情,这很棒,但是它有限制吗?我可以完全避免编写 sql 查询和准备语句或其他必须求助的情况吗?

TL;DR:用户实体也有其他字段。我想做一个只获取用户分配的任务的控制器路由,而不是每次都获取整个对象。我该怎么做?

【问题讨论】:

  • 你能分享整个实体吗
  • 我认为这个查询可以获取特定用户 entityManager.createQuery("Select distinct t from Task t join t.users u where u.id = :uid")
  • 如果你添加一个例子会更清楚你的问题。

标签: java spring spring-boot jpa dao


【解决方案1】:

我假设您使用的是 Spring Data JPA。在这种情况下,您很可能已经拥有 UserRepository extends JpaRepositry&lt;User, Long&gt; 之类的东西(假设主键是 Long)。

只需创建一个TaskRepository extends JpaRepository&lt;Task, Long&gt; 并将以下方法:List&lt;Task&gt; findAllByUserId(Long userId); 添加到该接口。这假定Task 有一个字段User user,而User 的主要字段称为id(因此称为“byUserId”)。

有关如何使用 Spring Data 存储库创建查询的更多详细信息,请参阅 Spring Data JPA, Query Creation

如果您需要更多控制,还可以查看同一文档中的 @Query 注释。

【讨论】:

  • 我知道你在说什么。我已经使用了@query,并且我已经是一个 taskrepository。
  • 在我的情况下,我不想获取每个任务的分配任务,而是我想自己获取分配的任务。
  • 我不完全确定你想要实现什么。如果不获取分配给用户的任务集合,那么“仅获取用户分配的任务”到底是什么意思?
  • 你说得对,我忘了解释得很好。很抱歉造成误解。我已经可以为每个用户获取任务。但是每个用户都有任务和分配的任务。由其他用户分配给他们。在数据库中,我这样做了,因此分配的任务表是一个连接表,它将相应的任务与相应的用户连接起来。我可以将assignedtasks列表放在用户模型中,然后fetch工作正常,但不幸的是它也获取了所有用户详细信息,但我只想获取用户分配的任务而不是其他字段...... ...跨度>
  • 我目前正在尝试像您提出的那样的解决方案...如果可行,我将接受您的正确回答。
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
相关资源
最近更新 更多