Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

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

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

Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");

after em.createQuery here, and good

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top