【问题标题】:Java JPA Illegal Argument Exception - NamedQuery of name: xyz not foundJava JPA 非法参数异常 - NamedQuery of name: xyz not found
【发布时间】:2016-07-14 04:57:11
【问题描述】:

我正在尝试使用此命名查询根据他们的 ID 获取用户,但是我不断收到非法参数异常。我一直在看这段代码一段时间。希望有人能抓住我可能错过的东西。 这是我的 ORM

@Entity
@Table(name = "MYUSER")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Myuser.findAll", query = "SELECT m FROM Myuser m"),
@NamedQuery(name = "Myuser.findByUserid", query = "SELECT m FROM Myuser m WHERE m.userid = :userid"),
@NamedQuery(name = "Myuser.findByName", query = "SELECT m FROM Myuser m WHERE m.name = :name"),
@NamedQuery(name = "Myuser.findByPassword", query = "SELECT m FROM Myuser m WHERE m.password = :password"),
@NamedQuery(name = "Myuser.findByEmail", query = "SELECT m FROM Myuser m WHERE m.email = :email"),
@NamedQuery(name = "Myuser.findByTel", query = "SELECT m FROM Myuser m WHERE m.tel = :tel"),
@NamedQuery(name = "Myuser.findByAddress", query = "SELECT m FROM Myuser m WHERE m.address = :address"),
@NamedQuery(name = "Myuser.findBySecqn", query = "SELECT m FROM Myuser m WHERE m.secqn = :secqn"),
@NamedQuery(name = "Myuser.findBySecans", query = "SELECT m FROM Myuser m WHERE m.secans = :secans")})
public class Myuser implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@Basic(optional = false)
@Column(name = "USERID")
private Integer userid;
@Column(name = "NAME")
private String name;
@Column(name = "PASSWORD")
private String password;
@Column(name = "EMAIL")
private String email;
@Column(name = "TEL")
private Integer tel;
@Column(name = "ADDRESS")
private String address;
@Column(name = "SECQN")
private String secqn;
@Column(name = "SECANS")
private String secans;

public Myuser() {
}

public Myuser(Integer userid) {
    this.userid = userid;
}

public Integer getUserid() {
    return userid;
}

public void setUserid(Integer userid) {
    this.userid = userid;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public Integer getTel() {
    return tel;
}

public void setTel(Integer tel) {
    this.tel = tel;
}

public String getAddress() {
    return address;
}

public void setAddress(String address) {
    this.address = address;
}

public String getSecqn() {
    return secqn;
}

public void setSecqn(String secqn) {
    this.secqn = secqn;
}

public String getSecans() {
    return secans;
}

public void setSecans(String secans) {
    this.secans = secans;
}

@Override
public int hashCode() {
    int hash = 0;
    hash += (userid != null ? userid.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the id fields are not set
    if (!(object instanceof Myuser)) {
        return false;
    }
    Myuser other = (Myuser) object;
    if ((this.userid == null && other.userid != null) || (this.userid != null && !this.userid.equals(other.userid))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "ejbentity.Myuser[ userid=" + userid + " ]";
}

}

这是我的用户界面

@Stateless
public class MyuserFacade implements MyuserFacadeRemote {

@PersistenceContext(unitName = "EJBServer-ejbPU")
private EntityManager em;


protected EntityManager getEntityManager() {
    return em;
}

public MyuserFacade() {
    //super(Myuser.class);
}

@Override
public Myuser getUser(int userID) {
    Myuser aUser = new Myuser();
    aUser =   (Myuser)em.createNamedQuery("Myuser.findByUserid").setParameter("userid", userID).getResultList();
    return aUser;
}
}

我的persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence   http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
   <persistence-unit name="EJBEntityPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<!--<exclude-unlisted-classes>false</exclude-unlisted-classes>-->
<class>ejbentity.Myuser</class>
<properties>
  <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/EA"/>
  <property name="javax.persistence.jdbc.password" value="test"/>
  <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/>
  <property name="javax.persistence.jdbc.user" value="test"/>
    </properties>
   </persistence-unit>
</persistence>

错误日志如下:

java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.appclient.client.acc.AppClientContainer.launch(AppClientContainer.java:446)
at org.glassfish.appclient.client.AppClientFacade.main(AppClientFacade.java:166)
Caused by: javax.ejb.EJBException
at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:752)
at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:702)
at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:507)
at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4566)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2074)
at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2044)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:212)
at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:79)
at com.sun.proxy.$Proxy266.getUser(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:143)
at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:173)
at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatchToServant(ServerRequestDispatcherImpl.java:528)
at com.sun.corba.ee.impl.protocol.ServerRequestDispatcherImpl.dispatch(ServerRequestDispatcherImpl.java:199)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequestRequest(MessageMediatorImpl.java:1549)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:1425)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleInput(MessageMediatorImpl.java:930)
at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:213)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.handleRequest(MessageMediatorImpl.java:694)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.dispatch(MessageMediatorImpl.java:496)
at com.sun.corba.ee.impl.protocol.MessageMediatorImpl.doWork(MessageMediatorImpl.java:2222)
at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
at com.sun.corba.ee.impl.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
         Caused by: java.lang.IllegalArgumentException: NamedQuery of name: Myuser.findByUserid not found.
at org.eclipse.persistence.internal.jpa.QueryImpl.getDatabaseQueryInternal(QueryImpl.java:355)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createNamedQuery(EntityManagerImpl.java:1135)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createNamedQuery(EntityManagerWrapper.java:522)
at stateless.MyuserFacade.getUser(MyuserFacade.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:73)
at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:205)
... 19 more
Java Result: 1

【问题讨论】:

  • 你能显示你的堆栈跟踪吗?你到底在哪里得到错误?
  • @Anmol 我将把我的堆栈跟踪放在编辑中。它出现在 aUser = (Myuser)em.createNamedQuery("Myuser.findByUserid").setParameter("userid", userID).getResultList();

标签: java jpa netbeans dao


【解决方案1】:

实际错误:

Caused by: java.lang.IllegalArgumentException: NamedQuery of name: Myuser.findByUserid not found.

发生在:

@NamedQuery(name = "Myuser.findByUserid", query = "SELECT m FROM Myuser m WHERE m.userid = :userid"),

更新: 从您的 persistence.xml:

<persistence-unit name="EJBEntityPU" transaction-type="RESOURCE_LOCAL">

你在这里使用transaction-type="RESOURCE_LOCAL"。所以如果你使用它,那么你就要对EntityManager负责。 那你一定要关注(JPA Concepts: JPA 101)

  1. 您必须使用EntityManagerFactory 才能获得EntityManager
  2. 生成的EntityManager 实例是PersistenceContext/Cache
  3. EntityManagerFactory 可以通过@PersistenceUnit 注入 仅注释(不是@PersistenceContext
  4. 你不能使用@PersistenceContext来指代一个单位 输入RESOURCE_LOCAL
  5. 您必须使用EntityTransaction API 开始/提交每个 致电您的EntityManger
  6. 调用entityManagerFactory.createEntityManager() 两次导致 两个单独的 EntityManager 实例,因此两个单独的 PersistenceContexts/Caches
  7. 拥有多个实例几乎从来都不是一个好主意 EntityManager 正在使用中(不要创建第二个,除非你已经 摧毁第一个)

解决方案:

这是example。如果您想使用RESOURCE_LOCAL,可以按照教程进行操作。

相关链接:

  1. DON'T USE JPA'S RESOURCE_LOCAL ON THE SERVER
  2. Persistence unit as RESOURCE_LOCAL or JTA?
  3. persistence.xml different transaction-type attributes

【讨论】:

  • 对不起,我尝试了你的方法,但它仍然给了我一个注入异常。
  • @JianYA 我已经用一些建议和示例更新了答案。请检查一下好吗?
  • 我现在正在浏览它们。我的 EntityManager 是由 Netbeans 自动生成的。在您给我的第一个链接中,他们引用了一个 account.class,就我的代码而言,它在哪里?
  • 我认为使用JTA会更好。因为在这种情况下您不需要更多关注 EntityManager 。请尝试使用 JTA 并让我更新
【解决方案2】:

我们遇到了同样的错误,这是因为persistence.xml 中缺少实体

【讨论】:

    【解决方案3】:

    我注意到您的 persistence.xml 中有 ejbentity.Myuser 类。该类实际上存在于一个包结构中,该结构由一个名为“ejbentity”的目录组成?堆栈跟踪表明未找到带有 NamedQuery 注释的 Myuser 类,如果您的包结构未按预期加载,则会对此进行解释。

    【讨论】:

    • 是的。 Myuser 存在于一个名为 ejbentity 的包中。但是,该包是在导入 ejbentity.Myuser 中加载的;在 MyuserFacade.java 中。你对此有什么建议?我不是很熟悉抱歉。
    • 你能解释一下你的“ejbentity”目录的目录结构吗?更典型的 Java 包结构是一系列以“com”或“org”等顶级域开头的嵌套目录。
    【解决方案4】:

    我认为事务类型与@NamedQuery 注释没有任何关系。

    这个错误

    原因:java.lang.IllegalArgumentException: NamedQuery of name: Myuser.findAll not found。 在 org.eclipse.persistence.internal.jpa.QueryImpl.getDatabaseQueryInternal(QueryImpl.java:355)

    看起来像一个 EclipseLink 错误。你用的是哪个版本?

    【讨论】:

      【解决方案5】:

      在你的 persistence.xml 中是:

      <persistence-unit name="EJBEntityPU"
      

      但是在你的 MyuserFacade 中你使用:

      @PersistenceContext(unitName = "EJBServer-ejbPU")
      

      您应该将其更改为:

      @PersistenceContext(unitName = "EJBEntityPU")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 2018-12-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多