为什么我需要在实体类上放置@NamedQuery?

问题描述 投票:0回答:3

我目前正在学习 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 时被迫将它放在实体类中?

java servlets jpa named-query
3个回答
2
投票

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


2
投票

查看@NamedQuery的文档

在 Java 持久性查询中指定静态、命名查询 语言。查询名称的范围仅限于持久性单元。这 NamedQuery注释可以应用于实体或映射 超类。

注释被复制到持久化单元。 Servlet 不在这个范围内。


0
投票

这记录在

@NamedQuery
Javadoc 中。即,

NamedQuery 注释可以应用于实体或映射的超类。

© www.soinside.com 2019 - 2024. All rights reserved.