5

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?

giannis christofakis
  • 8,201
  • 4
  • 54
  • 65
Bellil Med Samouel
  • 321
  • 2
  • 8
  • 20

5 Answers5

16

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.

6

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

Flying Dumpling
  • 1,294
  • 1
  • 11
  • 13
1

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

Lucky
  • 16,787
  • 19
  • 117
  • 151
treeno
  • 2,510
  • 1
  • 20
  • 36
0

I had a similar error when I migrated working code from Java 8 to 17 (and also with 11). I was using EclipseLink (2.5).

The fix was to upgrade EclipseLink to 2.7 and it worked again.

Kevin Sadler
  • 2,306
  • 25
  • 33
-3
Query q =em.createNamedQuery("select bc from Bondecommande bc where bc.idbc = :idbc");

after em.createQuery here, and good

Lucky
  • 16,787
  • 19
  • 117
  • 151
matos
  • 1