使用JPA联接表

时间:2019-05-29 22:33:33

标签: java oracle jpa

我正在尝试创建一个JPQL查询,该查询从我的3个表中获取特定字段:

  

idCurso,nombCurso,fRegistro,idProfesor,nombProfe,idAula,描述

我的实体JPA:

// TABLE:AULA

@Entity
@Table(name="aulas")
public class Aula implements Serializable{
private static final long serialVersionUID = 1L;

@Id
private String id;  
private String descripcion; 
@Temporal(TemporalType.DATE)
private Date fRegistro; 
private Integer estado; 
@OneToMany(mappedBy = "aula",cascade = {CascadeType.ALL})
private List<Curso> curso;

//表:教授

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Table(name="profesores")
public class Profesor implements Serializable{

private static final long serialVersionUID = 1L;
@Id
private String id;  
private String nombProfe;   
@Temporal(TemporalType.DATE)
private Date f_nacimiento;  
private Integer estado; 
@OneToMany(mappedBy = "profesor", cascade = {CascadeType.ALL})
private List<Curso> curso;

//表:光标

@Entity
@Table(name="cursos")
public class Curso implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
private String id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "profesor_id")
@JsonIgnore
private Profesor profesor;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "aula_id")
@JsonIgnore
private Aula aula;

private String nomCurso;

@Temporal(TemporalType.DATE)
private Date fRegistro;

//仓库

public interface CursoRepositorio extends JpaRepository<Curso, String>{}

//服务

@Autowired
CursoRepositorio cursoRepositorio;
@PersistenceContext
private EntityManager em;
    public Curso buscarById(String id)
    {
        return (Curso) em.createQuery("SELECT c.id,c.nomCurso,c.fRegistro,a.id,a.descripcion,p.id,p.nombProfe FROM Curso c JOIN c.aula a JOIN c.profesor p WHERE c.id= :p1")
                .setParameter("p1", id)


      .getResultList();
}

// CONTROLLER

@GetMapping("/curso/{id}")
public Curso CursoById(@PathVariable("id") String id) {
    return cursoServicio.buscarById(id);

}

我尝试了以下查询:

SELECT c.id,c.nomCurso,c.fRegistro,a.id,a.descripcion,p.id,p.nombProfe FROM Curso c JOIN c.aula a JOIN c.profesor p WHERE c.id= :p1

错误(SOAPUI):

  

java.util.ArrayList无法转换为com.unjfsc.rest.model.Curso

我认为也许我应该创建一个临时表来简化查询,但是如何实现呢?

1 个答案:

答案 0 :(得分:0)

您正在尝试在List类上投射Curso。 要解决此问题,您应该执行以下操作:

List<Object[]> results = em.createQuery("SELECT c.id,c.nomCurso,c.fRegistro,a.id,a.descripcion,p.id,p.nombProfe FROM Curso c JOIN c.aula a JOIN c.profesor p WHERE c.id= :p1").setParameter("p1", id).getResultList();

随后,进行适当的映射,并从您的方法中返回正确初始化的对象。