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

Kri*_*ish 22 jpa

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

小智 38

  • 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();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • createNamedQuery方法用于创建静态查询,或使用javax.persistence.NamedQuery批注在元数据中定义的查询.@NamedQuery的name元素指定将与createNamedQuery方法一起使用的查询的名称.@NamedQuery的查询元素是查询:

    @NamedQuery(
    name="findAllCustomersWithName",
    query="SELECT c FROM Customer c WHERE c.name LIKE :custName"
    )
    
    Run Code Online (Sandbox Code Playgroud)

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

    @PersistenceContext
    public EntityManager em;
    ...
    customers = em.createNamedQuery("findAllCustomersWithName")
    .setParameter("custName", "Smith")
    .getResultList();
Run Code Online (Sandbox Code Playgroud)
  • createNativeQuery创建Query实例以执行本机SQL语句.以下是选择createNativeQuery的一些原因:

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

有关详细信息,请访问以下链接

使用Java持久性查询语言创建查询

JPA为什么要使用createNamedQuery

为什么我们需要创建本机查询?


Abd*_*hak 17

  1. CreateQuery:用于创建JPQL
  2. createNamedQuery:用于定义与名称查询的映射文件或注解去这个
  3. createNativeQuery:用于执行本机/纯SQL查询示例