实体表未映射

时间:2019-12-09 15:45:58

标签: java sql hibernate spring-boot jpql

我是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;
}

谢谢。

1 个答案:

答案 0 :(得分:0)

由于@XtremeBaumer,我发现JPQL将Entity类名转换为表名。

查询应为:SELECT t FROM TourEntity WHERE....