JPA&x27;s EntityManager createQuery()与createNamedQuery()与createNativeQuery()的比较

JPA&x27;s EntityManager createQuery()与createNamedQuery()与createNativeQuery()的比较,jpa,Jpa,有人能给我解释一下JPA的EntityManager的以下方法之间的区别吗 createQuery() createNamedQuery() createNativeQuery() 并向我解释在哪些情况下我们应该使用哪种方法? createQuery方法用于创建动态查询,这些查询是直接在应用程序的业务逻辑中定义的查询。 例如: createNamedQuery方法用于创建静态查询,或使用javax.persistence.NamedQuery注释在元数据中定义的查询。@NamedQuery

有人能给我解释一下JPA的EntityManager的以下方法之间的区别吗

  • createQuery()
  • createNamedQuery()
  • createNativeQuery()
并向我解释在哪些情况下我们应该使用哪种方法?

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

  • 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创建用于执行本机查询的查询实例 SQL语句。以下是选择createNativeQuery的一些原因:

    • 低级别访问,这意味着您可以自己优化和处理映射;使用SQL实际访问数据库表,而使用JPQL访问实体对象
    • 如果您已经了解SQL,那么可能不想学习JPQL
    • 您已经用SQL编写了查询,并且没有资源/时间将它们移植到JPQL
有关更多详细信息,请访问以下链接:

  • CreateQuery:用于创建
  • createNamedQuery:用于定义映射文件或批注中具有名称的查询
  • createNativeQuery:用于执行本机/纯SQL查询

  • CreateQuery
    用于创建JPQLqueries

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


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

    除了“HQL”与JPA无关之外。JPA使用JPQL,而这个链接理论上可以回答这个问题,在这里包括答案的基本部分,并提供链接供参考。否则一句评论就足够了。
        @PersistenceContext
        public EntityManager em;
        ...
        customers = em.createNamedQuery("findAllCustomersWithName")
        .setParameter("custName", "Smith")
        .getResultList();