【问题标题】:Not able to join 2 tables in spring data jpa无法在 spring data jpa 中加入 2 个表
【发布时间】:2023-01-24 23:31:53
【问题描述】:

我是 spring-data-jpa 的新手。我正在研究任务管理系统。 我有 2 个实体:

public class Task {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long taskId;
private String title;
private String description;
private Status status;

@OneToOne
@JoinColumn(name = "user_id", referencedColumnName = "userId")
private User assignee;

和:

@Entity
@Table(name = "tbl_user")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long userId;
private String name;
private String email;
private Active active;
private String password;

}

我有一个创建新任务的端点:

    @PostMapping
@ResponseStatus(HttpStatus.CREATED)
public TaskResponse addTask(@Valid @RequestBody Task task){
    return taskService.addTask(task);
}

这是实现:

    @Override
public TaskResponse addTask(Task task) {
    taskRepository.save(task);
    return mapToTaskResponse(task);
}

发送请求时出现的错误是:

2023-01-24 15:10:01.825  WARN 1961 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.tasksmanagement.entity.User` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (1); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.tasksmanagement.entity.User` (although at least one Creator exists): no int/Int-argument constructor/factory method to deserialize from Number value (1)<EOL> at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 5, column: 17] (through reference chain: com.tasksmanagement.entity.Task["assignee"])]

我不确定我做错了什么。基本上,我创建一个用户并在请求中发送该用户的 ID(负载中的受让人字段 - 附上屏幕截图),以便将新任务分配给该用户。 任何人都可以协助并帮助我理解请求的问题是什么吗? 我应该发送其他东西而不是 userId 吗?

谢谢

【问题讨论】:

  • TaskTaskRequest 吗????
  • 不。我用正确的方法编辑了问题

标签: spring-boot spring-data-jpa


【解决方案1】:

assignee 的类型为 User 而不是 Integer,但您发送的 assignee:1 未能反序列化您的请求。

应该是

assignee:{ userId:1 }

但无论如何它都会在稍后尝试坚持Task时失败(但这是一个不同的问题)

【讨论】:

    【解决方案2】:

    所以基本上你想为 User 创建一个 Taskid 为 1。

    您需要做的就是将您的 User 对象映射到您的 Task 对象。

    尝试以下

    @Override
    public TaskResponse addTask(Task task) {
        User assignee = new User();
        assignee.setUserId(task.assignee);
    
        task.setAssignee(assignee);
    
        taskRepository.save(task);
        return mapToTaskResponse(task);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2017-01-12
      • 1970-01-01
      相关资源
      最近更新 更多