【问题标题】:Named Query Or Native Query or Query Which one is better in performance point of view?Named Query or Native Query or Query 从性能的角度来看,哪一个更好?
【发布时间】:2014-09-30 13:57:33
【问题描述】:

以下哪个更好(EJB 3 JPA)

//查询

一)。 getEntityManager().createQuery("从用户o中选择o");

//在实体级别定义findAllUser的命名查询

b)。 getEntityManager().createNamedQuery("User.findAllUser");**

//原生查询

c)。 getEntityManager().createNativeQuery("SELECT * FROM TBLMUSER");

请解释一下哪种方法在哪种情况下更好?

【问题讨论】:

    标签: java ejb-3.0


    【解决方案1】:
    1. createQuery()

      它应该用于动态查询创建。

      //Example dynamic query
      StringBuilder builder = new StringBuilder("select e from Employee e");
      if (empName != null) {
          builder.append(" where e.name = ?");
      }
      getEntityManager().createQuery(builder.toString());
      
    2. createNamedQuery()

      它就像一个可以通过名称重用的常量变量。您应该在常见的数据库调用中使用它,例如“查找所有用户”、“按 id 查找”等。

    3. createNativeQuery()

      这将创建一个完全依赖于底层数据库的 SQL 脚本语言支持的查询。当需要复杂查询并且 JPQL 语法不支持它时,它很有用。

      但是,如果底层数据库从一个更改为另一个,它可能会影响您的应用程序并需要更多工作。一个示例是,如果您的开发环境使用 MySQL,而您的生产环境使用 Oracle。此外,如果有多个结果,返回的结果绑定可能会很复杂。

    【讨论】:

      【解决方案2】:

      命名查询与查询相同。它们的命名只是为了让它们可重用+它们可以在不同的地方声明,例如。在类映射、conf 文件等中(因此您可以在不更改实际代码的情况下更改查询)

      本机查询只是本机查询,您必须完成 JPA 查询为您所做的所有事情,例如。绑定和引用值等+它们使用独立于 DBMP 的语法(在您的情况下为 JPQL),因此更改数据库系统(让 saq 从 MySQL 到 Postgresql 或 H2)将需要更少的工作,因为它不需要(并非总是)重写本机查询。

      【讨论】:

        【解决方案3】:

        对我来说,显然前两个更好,即 JPQL 查询 - 第二个意味着实体管理器将在加载持久性单元时编译查询(并验证它们),而第一个只会在执行时产生错误时间。

        您还可以在某些 IDE 中获得支持,它支持对象表示法(例如:select b from EntityA a left join a.entityB b)和对象关系映射引入的其他一些奇怪的东西(例如集合、索引等)。

        另一方面,在 JPQL 的极端情况下,在万不得已的情况下使用原生查询(如窗口函数,如 select id, partition by (group_id) from table

        【讨论】:

          【解决方案4】:

          Native SQL 不一定比 Hibernate/JPA Query 快。 Hibernate/JPA Query 最后也被翻译成 SQL。在某些情况下,它可能会发生 Hibernate/JPA 不会生成最有效的语句,因此本机 SQL 可以更快 - 但是使用本机 SQL,您的应用程序会失去从一个数据库到另一个数据库的可移植性,因此通常最好调整 Hibernate/JPA查询映射和 HQL 语句生成更高效的 SQL 语句。在本机 SQL 的另一面,您缺少 Hibernate 缓存 - 因此在某些情况下本机 SQL 可能比 Hibernate/JPA Query 慢。

          我不关心性能,在大多数情况下,如果您加载所有列或仅加载所需的列,则与性能无关。在数据库访问中,搜索行时会丢失时间,而不是将数据传输到应用程序时。当您只阅读必要的列时。

          【讨论】:

          • 使用本机查询并不会真正失去可移植性。通过使用本机查询并在查询中包含特定于数据库的内容,您会失去可移植性。如果您的查询只是普通的标准 SQL(使用与所有其他 SQL 兼容的数据库使用相同的语法),那么这对您的可移植性有何影响?
          【解决方案5】:

          简单的答案: 1) createQuery() - 当您希望查询在运行时执行时。

          2) createNamedQuery() - 当您想要发送常见的数据库调用时,例如 findBy<attribute>findAll、..

          3)createNativeQuery() - 当您希望查询特定于数据库供应商时使用。这带来了便携性的挑战。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-06-04
            • 1970-01-01
            • 2022-06-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多