JPA的EntityManager createQuery()vs createNamedQuery()vs createNativeQuery()

时间:2015-11-19 08:18:51

标签: jpa

任何人都可以解释一下JPA的EntityManager的以下方法之间的区别: createQuery(),createNamedQuery()和createNativeQuery() 并解释我在哪些情况下你应该使用哪种方法?

3 个答案:

答案 0 :(得分:34)

  • createQuery 方法用于创建动态查询,这些查询是直接在应用程序的业务逻辑中定义的查询。 例如:

    public List findWithName(String name) {
    return em.createQuery(
    "SELECT c FROM Customer c WHERE c.name LIKE :custName")
    .setParameter("custName", name)
    .setMaxResults(10)
    .getResultList();
    }
    
  • createNamedQuery 方法用于创建静态查询,或使用javax.persistence.NamedQuery批注在元数据中定义的查询。 @NamedQuery的name元素指定将与createNamedQuery方法一起使用的查询的名称。 @NamedQuery的查询元素是查询:

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

这是createNamedQuery的一个例子,它使用@NamedQuery:

    @PersistenceContext
    public EntityManager em;
    ...
    customers = em.createNamedQuery("findAllCustomersWithName")
    .setParameter("custName", "Smith")
    .getResultList();
  • createNativeQuery 创建Query实例以执行本机 SQL语句。以下是选择 createNativeQuery

    的一些原因
    • 低级访问,这意味着您可以自己优化和处理映射;使用SQL实际访问数据库表,而使用JPQL访问实体对象;
    • 如果您已经了解SQL
    • ,也许您不想学习JPQL
    • 您已经使用SQL编写了查询,并且没有资源/时间将它们移植到JPQL

有关详情,请访问以下链接:

Creating Queries Using the Java Persistence Query Language

JPA why use createNamedQuery

Why do we need to create native query?

答案 1 :(得分:15)

  1. CreateQuery:用于创建JPQL
  2. createNamedQuery:用于在映射文件或注释go to this
  3. 中定义具有名称的查询
  4. createNativeQuery:用于执行本机/纯SQL查询Example

答案 2 :(得分:1)

CreateQuery用于创建JPQLqueries

createNamedQuery用于在映射文件或注释中定义具有名称的查询,例如:obj.createNamedQuery("entity.findbycode",Something.class)

createNativeQuery用于执行本机/纯SQL查询。