【发布时间】:2020-04-02 18:09:35
【问题描述】:
我是 Springboot 新手,在使用 JPQL 语句从我的实体表中检索条目时遇到了挑战。
我正在运行一个小型 Spring Web 项目,Postman 对我的 Java API 的调用应该返回一个“Tour”实体。问题是当我使用em.find(Entity.class, PrimaryKey) 时,检索实体没有问题,但是当我使用JPQL 语句"SELECT t FROM tour t WHERE t.employee.empName = ?1" 时,它抛出一个异常,基本上说实体表没有映射。
关于如何克服这个问题有什么建议吗?
相关代码: API方法
@CrossOrigin
@GetMapping(value = "/test")
public ResponseEntity<Tour> testMethod(@RequestBody String name){
Tour t = null;;
try {
t = service.getTour(name);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return new ResponseEntity<Tour>(t, HttpStatus.OK);
}
服务方式
public Tour getTour(String name) throws Exception{
Tour t = dao.getTour(name);
if(t == null) {
throw new Exception("Service.TOUR_NOT_FOUND");
}
return t;
}
DAO 方法
public Tour getTour(String name) {
String sql = "SELECT t FROM tour t WHERE t.employee.empName = ?1";
Query q = em.createQuery(sql);
q.setParameter(1, name);
TourEntity te = (TourEntity) q.getSingleResult();
Tour t = new Tour();
Employee e = new Employee();
ArrayList<Visitor> vl = new ArrayList<Visitor>();
for(VisitorEntity ve : te.getVisitors()) {
Visitor v = new Visitor();
v.setVisitorId(ve.getId());
v.setName(ve.getName());
v.setEmail(ve.getEmail());
v.setCompany(ve.getCompany());
v.setFeedback(ve.getFeedback());
v.setDesignation(ve.getDesignation());
v.setPhoneNo(ve.getPhone());
vl.add(v);
}
e.setEmpId(te.getEmployee().getEmpId());
e.setName(te.getEmployee().getEmpName());
e.setDesignation(te.getEmployee().getDesignation());
if(te.getEmployee().getIsAdmin().equals("Y")) {
e.setAdmin(true);
}else {
e.setAdmin(false);
}
e.setEmail(te.getEmployee().getEmail());
e.setPassword(te.getEmployee().getPassword());
t.setTourId(te.getId());
t.setFeedback(te.getFeedback());
t.setVisitor(vl);
t.setEmployee(e);
t.setTourDate(te.getTourDate().toLocalDate());
return t;
}
实体类
@Entity
@Table(name="tour")
public class TourEntity {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
@Column(name="tour_date")
private Date tourDate;
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="employee_id")
private EmployeeEntity employee;
private String feedback;
@OneToMany(targetEntity=VisitorEntity.class)
@JoinColumn(name="id")
private List<VisitorEntity> visitor;
**Getters & Setters**
@Entity
@Table(name="Employee")
public class InfoscionEntity {
@Id
@Column(name="emp_id")
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer empId;
@Column(name="empname")
private String empName;
private String email;
private String designation;
private String password;
@Column(name="isadmin")
private String isAdmin;
**Getters and Setters**
谢谢。
【问题讨论】:
-
JPQL将类名转换为指定的表名。它认为tour将是一个类名。使用SELECT t FROM TourEntity t... -
谢谢。你的建议奏效了。
标签: java sql hibernate spring-boot jpql