我正在尝试创建一个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
我认为也许我应该创建一个临时表来简化查询,但是如何实现呢?
答案 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();
随后,进行适当的映射,并从您的方法中返回正确初始化的对象。