使用jpa进行多对多关系配置时,遇到的问题

这里有两个实体类Student,Homework,中间表Student_Homework
第一步,先进行常规的配置

package com.itcast.pojo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;

@Data
@Entity
@IdClass(Student_HomeworkKey.class)
@Table(name="student_homework")
public class Student_Homework implements Serializable {

    private static final long serialVersionUID = 3586335994284551414L;
    @Id
    @ManyToOne
    @JoinColumn(name="student_id")
    private Student student;

//    @JsonIgnore
    @Id
    @ManyToOne
    @JoinColumn(name="homework_id")
    private Homework homework;
    @Column(name="submitdate")
    private String submitdate;
    @Column(name="content")
    private String content;
    @Column(name="homeworkpath")
    private String homeworkpath;
    @Column(name="score")
    private double score;
    @Column(name="status")
    private char status;

    //省略getset

  
}

第二步,配置好之后,运行出现了
does not define an IdClass的错误,
经查询,得知:因为我这里是联合主键使用了两个@id注解
所以需要在上面定义ID类,所以需要标识@idclass("***.class")注解,这是一个特殊的id类,用来反映主键字段。

id类的配置如下:

public class Student_HomeworkKey implements Serializable {
    private static final long serialVersionUID = 3586335994284551414L;
    private Student student;
    private Homework homework;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student_HomeworkKey that = (Student_HomeworkKey) o;
        return Objects.equals(student, that.student) &&
                Objects.equals(homework, that.homework);
    }

    @Override
    public int hashCode() {
        return Objects.hash(student, homework);
    }
}

在编写中间类的jparepository的时候,主键也是该ID类Student_HomeworkKey

public interface Student_HomeworkRepository extends JpaRepository<Student_Homework, Student_HomeworkKey>, JpaSpecificationExecutor<Student_Homework> {

//    Student_Homework findBystudentidAndhomeworkid(String studentid ,String homeworkid);

第三步,运行的时候,再次报了错误
No converter found capable of converting from type [java.lang.String] to type [com.itcast.pojo.Homework]] with root cause
经查询发现:JPA 原生 sql 的返回不能直接转换成对象,原生 sql 的返回形式是 Map 、 List 或 Object,因此可以使用 List<Map<String,Object>> 接收
在repository使用原生的sql的时候

参考博客:
https://blog.csdn.net/kejidaren/article/details/84380753
https://blog.csdn.net/wsjzzcbq/article/details/103412827

猜你喜欢

转载自blog.csdn.net/weixin_42063820/article/details/104583767