为什么我需要将@NamedQuery 放在实体class 上?

Why do I need to put @NamedQuery on Entity class?

我目前正在学习 JPA NamedQueries 并尝试在 GuestServlet 中使用它:

Query getGuests =  em.createNamedQuery("myq");
@SuppressWarnings("unchecked")
List<Guest> guests = getGuests.getResultList();

当我将 @NamedQuery 放入实体中时它起作用 class:

@Entity
@NamedQuery(
    name="myq",
    query = "SELECT g FROM Guest g")
public class Guest {
  ...
}

但是当我尝试在 Servlet 中使用它时,如下所示:

@WebServlet({"/GuestServlet","/guest"})
@NamedQuery(
        name="myq",
        query = "SELECT g FROM Guest g")
public class GuestServlet extends HttpServlet {...}

我收到以下错误:

java.lang.IllegalArgumentException: No query defined for that name [myq]

为什么我在 Servlet 中使用 @NamedQuery 时必须将它放在实体 class 中?

GuestServlet 不是由您的 jpa 提供商管理的。 Hibernate(或其他)根本不知道命名查询。

这在 @NamedQuery Javadoc 中有记录。即,

The NamedQuery annotation can be applied to an entity or mapped superclass.

看看 documentation of @NamedQuery:

Specifies a static, named query in the Java Persistence query language. Query names are scoped to the persistence unit. The NamedQuery annotation can be applied to an entity or mapped superclass.

注释被 scp 到持久性单元。 Servlet 在此范围之外。