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?
after
em.createQuery
here, and goodUse
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.
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.htmlIn 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:You use named queries by passing the name of the query to create method:
I recommend to use
TypedQuery<T>
notQuery
if you are using JPA 2.x