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

时间:2015-08-13 07:38:56

标签: java servlets jpa named-query

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

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

当我将@NamedQuery放在Entity类中时,它可以工作:

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

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

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

我收到以下错误:

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def get_csrf_token(request):
    c = {}
    c.update(csrf(request))
    print c
    return render_to_response('csrf.html', c)

@csrf_exempt
def confirm_email(request):
    print 'here'
    return JsonResponse({'response': 0})

为什么在Servlet中使用它时,我被迫将@NamedQuery放在Entity类中?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

查看documentation of @NamedQuery

  

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

注释被固定到持久性单元。 Servlet不在此范围内。

答案 2 :(得分:0)

@NamedQuery Javadoc中记录了这一点。即,

  

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