java.lang.IllegalArgumentException: Named query not found:

39,064

Solution 1

Use em.createQuery(... instead of em.createNamedQuery()

If you work with named queries (what I would recommend) you have to place the query inside a @NamedQuery annotation on your entity class.

Solution 2

In JPA query and named query are not the same things.

Named queries have "names" and you define them by adding @NamedQueries annotation on your entity type class:

@Entity
@Table(name="bondecommande")
@NamedQueries({
    @NamedQuery(name="Bondecommande.findByIdbc", query="select bc from Bondecommande bc where bc.idbc = :idbc"),
    @NamedQuery(name="...", query="..."),
}) 
public class Bondecommande  implements Serializable {

    ....
}

You use named queries by passing the name of the query to create method:

Query q =em.createNamedQuery("Bondecommande.findByIdbc");

I recommend to use TypedQuery<T> not Query if you are using JPA 2.x

Solution 3

createNamedQuery() takes a name of a query and not the query itself.

The Query can be defined by an annotation @NamedQuery Take a look at this: http://docs.oracle.com/javaee/6/api/javax/persistence/NamedQuery.html

Share:
39,064

Related videos on Youtube

Bellil Med Samouel
Author by

Bellil Med Samouel

Updated on July 09, 2022

Comments

  • Bellil Med Samouel
    Bellil Med Samouel almost 2 years

    I got the following code

    @Stateless
    public class BondecomandeDAO {
    
        @PersistenceContext
        private EntityManager em;
    
        public Bondecommande findBCbyid(int id)
        {
             Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");
             q.setParameter("idbc", id);
             return  (Bondecommande) q.getResultList().get(0);
         }
    }
    

    and

    @Entity
    @Table(name="bondecommande")
    public class Bondecommande  implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        @Column(name="idbc")
        private int idbc;
        @Column(name="devise")
        private String devise;
        @Column(name="modepaiement")
        private String modepaiement;
        @Column(name="modelivraison")
        private String modelivraison;
        @Column(name="delaipaiement")
        private int delaipaiement;
    
          ////other attributes , getters and setters 
    }
    

    When I try to run the function findBCbyid(int id) I get this error

    java.lang.IllegalArgumentException: Named query not found: select bc from Bondecommande bc where bc.idbc = :idbc

    Although I used this named query in an another project, and it worked, what could be the problem here?