JPA’s EntityManager createQuery() vs createNamedQuery() vs createNativeQuery()

  • The createQuery method is used to create dynamic queries, which are queries defined directly within an application’s business logic.
    Example:

    public List findWithName(String name) {
    return em.createQuery(
    "SELECT c FROM Customer c WHERE c.name LIKE :custName")
    .setParameter("custName", name)
    .setMaxResults(10)
    .getResultList();
    }
    
  • The createNamedQuery method is used to create static queries, or queries that are defined in metadata by using the javax.persistence.NamedQuery annotation. The name element of @NamedQuery specifies the name of the query that will be used with the createNamedQuery method. The query element of @NamedQuery is the query:

    @NamedQuery(
    name="findAllCustomersWithName",
    query="SELECT c FROM Customer c WHERE c.name LIKE :custName"
    )
    

Here’s an example of createNamedQuery, which uses the @NamedQuery:

    @PersistenceContext
    public EntityManager em;
    ...
    customers = em.createNamedQuery("findAllCustomersWithName")
    .setParameter("custName", "Smith")
    .getResultList();
  • The createNativeQuery Create an instance of Query for executing a native
    SQL statement. here are some reasons to choice createNativeQuery:

    • Low level access, which means that you can optimize and handle the mapping by yourself; with SQL you actually access the database table while with JPQL you access the entity objects;
    • Maybe you do not want to learn JPQL if you already know SQL
    • You already have the queries written in SQL, and do not have resources/time to port them to JPQL

For more details visit those links:

Creating Queries Using the Java Persistence Query Language

JPA why use createNamedQuery

Why do we need to create native query?

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)