【问题标题】:Entity table is not mapped实体表未映射
【发布时间】: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


【解决方案1】:

感谢@XtremeBaumer,我发现 JPQL 将实体类名转换为表名。

查询应该是:SELECT t FROM TourEntity WHERE....

【讨论】:

    猜你喜欢
    • 2021-09-13
    • 1970-01-01
    • 2011-09-28
    • 2019-12-03
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2012-05-25
    相关资源
    最近更新 更多