2013-03-14 32 views
3

getcreateQuery有什么优势?hibernate createQuery vs

我可以看到有可能在没有解析HQL轻微的性能改进,但没有任何其他主要的优势,使用克服的createQuery?

回答

5

首先,这是更快输入,是更可读,并明确表达了意图:通过ID得到的实体。基本上不可能发生错误,而在HQL查询中可能会出现拼写错误。

关于性能,主要优点是只有当实体不在会话缓存中时才执行select语句。每次都会执行HQL查询。如果你有二级缓存,如果实体已经在第二级缓存中,get()将避免完全执行查询。

+0

所以,根据这个,你对'get'的表现不正确:http://stackoverflow.com/questions/5370482/whats-the-advantage-of-load-vs-get-在冬眠。看起来你实际上是在谈论“负载”的表现。 – 2013-03-15 06:59:11

+0

没有。 'get()'看看实体是否在会话缓存中。如果已经存在,则返回。否则,它会执行一个SQL查询来加载它,将它放入会话缓存中,并将其返回。 'load()'检查实体是否在会话缓存中。如果已经存在,则返回。否则,它创建一个懒惰的代理,甚至不检查对象是否存在于数据库中,并返回此代理。你为什么不自己检查一下?打开SQL日志记录,然后进行试验。 – 2013-03-15 07:02:55

+0

有趣的区别。我在哪里可以阅读更多关于此?我找到'get'信息的地方似乎都提到它“总是碰到数据库”。他们是否都在重复相同的错误信息? – 2013-03-15 07:08:11

0

get()直接使用会话来检索对象。

  • get()仅当您要加载对象(即SQL SELECT)时才有用。
  • 像save()和persist()导致SQL INSERT,在SQL DELETE中删除()SQL UPDATE中的update()或merge()。
  • 有限控制,我们需要指定一个我们需要提取的实体。

createQuery()使用HQL

  • 使用HQL我们可以编写所有的CRUD查询。
  • 给予更多控制,我们可以指定HQL(SQL like)子句。
  • HQL是自己的休眠查询语言,它用于对休眠程序执行批量操作
  • SQL的一种面向对象的形式称为HQL。
  • 这里我们打算用POJO类名称和表名替换POJO类名称的表列名称以获得HQL命令
  • 有时候很难用其他替代方法编写。使用HQL我们可以更快地实现。
相关问题