今天再用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"。
如果本篇有幫助到您,幫忙點一下廣告支持,感恩。
參考:
沒有留言:
張貼留言