我目前正在学习 JPA NamedQueries 并尝试在 GuestServlet 中使用它:
Query getGuests = em.createNamedQuery("myq");
@SuppressWarnings("unchecked")
List<Guest> guests = getGuests.getResultList();
当我将 @NamedQuery 放入实体类中时它就起作用了:
@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 时被迫将它放在实体类中?
GuestServlet 不由您的 jpa 提供商管理。 Hibernate(或其他)根本不知道命名查询。
查看@NamedQuery的文档:
在 Java 持久性查询中指定静态、命名查询 语言。查询名称的范围仅限于持久性单元。这 NamedQuery注释可以应用于实体或映射 超类。
注释被复制到持久化单元。 Servlet 不在这个范围内。