我是Springboot的新手,并且在使用JPQL语句从我的实体表中检索条目时遇到了挑战。
我正在运行一个小型的spring网络项目,Postman对我的Java API的调用应该返回一个“ Tour”实体。问题是,当我使用"errorCode": "2200", "message": "Failure happened on 'Source' side.'Type=System.ArgumentOutOfRangeException,**Message=Index was out of range. Must be non-negative and less than the size of the collection.**\r\nParameter name:
时,检索实体没有问题,但是当我使用JPQL语句em.find(Entity.class, PrimaryKey)
时,它抛出一个异常,基本上说该实体表未映射。>
关于如何克服这一点的任何建议?
相关代码: API方法
"SELECT t FROM tour t WHERE t.employee.empName = ?1"
服务方法
@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);
}
DAO方法
public Tour getTour(String name) throws Exception{
Tour t = dao.getTour(name);
if(t == null) {
throw new Exception("Service.TOUR_NOT_FOUND");
}
return t;
}
实体类
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;
}
谢谢。
答案 0 :(得分:0)
由于@XtremeBaumer,我发现JPQL将Entity类名转换为表名。
查询应为:SELECT t FROM TourEntity WHERE....