AdSense

網頁

2018/6/15

Hibernate JPA JPQL org.hibernate.hql.internal.ast.QuerySyntaxException: [entity_name] is not mapped

今天再用JPA JPQL查詢時,出現錯誤如下

org.hibernate.hql.internal.ast.QuerySyntaxException: [entity_name] is not mapped

錯誤原因是Entity類別的名稱和JPQL查詢語句中查詢的Entity名稱不一致。

也因為這個錯誤我才進一步了解到JPQL語法中查詢的對象不是資料表,而是映射的Entity類別。

例如Entity類別Employee如下,映射資料表employee

Employee.java

package idv.matt.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="employee")
public class Employee {
    
    @Id
    @Column(name="id")
    private Integer id;
    
    @Column(name="name")
    private String name;
    
    @Column(name="email", unique=true)
    private String email;
    
    // getter and setter...
    
}

JPQL查詢語句如下。

public List findAll() {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("mydb");
    EntityManager em = emf.createEntityManager();
    
    String jpql = "SELECT e FROM employee e"; // JPQL查詢
    Query query = em.createQuery(jpql, Employee.class);
    
    return query.getResultList();
}

上面的JPQL就會導致org.hibernate.hql.internal.ast.QuerySyntaxException: employee is not mapped錯誤。

注意到問題在哪了嗎? 問題在JPQL的SELECT e FROM employee e

由於JPQL是大小寫敏感的(case-sensitive),且查詢的對象是Entity類別,不是資料表,而Employee類別上面的@Entity沒有指定名稱,所以Entity的名稱預設為類別名稱,即為"Employee",所以JPQL應該改成SELECT e FROM Employee e。要不然就是用@Entity(name="employee")指定Entity的名稱為"employee"。

如果本篇有幫助到您,幫忙點一下廣告支持,感恩。


參考:

沒有留言:

AdSense