在几篇文章中提到我们不应该获取表的所有列。我们应该避免Select * from table1
和写Select name, age, phone from table1
。
Q1)这是否意味着在编写 HQL 时,我们不应该编写from Table1
?
Q2 ) 我听说有些公司在他们的 java 代码中使用存储过程来获取数据,而不是编写 select 语句。这种技术真的有效吗?
Q3 ) 我听说这是针对单个应用程序的。有时使用多个数据库而不是单个数据库。为什么呢?这种技术好不好?
答案 1:Hibernate 不使用select *
: 它转换select from table
为select col1, col2, col3 ... from table1
. 此外,如果您没有定义要休眠的列,它将不会选择它。
答案 2:我的建议是避免使用存储过程。它们实际上很少比查询快,尤其是对于简单的数据检索。有很多不使用它们的充分理由,包括 1) 不可移植,2) 无法调试,3) 无法进行单元测试,不胜枚举
答案 3:我会使用一个数据库,而不是拆分您的数据。管理起来太难了,而且您在系统中添加更多组件却无济于事(大多数系统也使用一个数据库,所以它不会那么糟糕)。然而,分布式数据库是一个好主意。
使用 ORM 的想法是使用 Java 对象。所以使用from Table
没问题,它让你准备好使用对象但是......
可能会发生您有大字段 Blob 或 Clob,然后将它们标记为延迟加载,因此您不必将它们保存在 Session 缓存中,这会消耗内存。
也可能发生需要选择 100 000 行的情况,那么使用 ORM 映射没有意义。您应该回退到 SQL 原生查询(Hibernate 也很好地管理它)。
对于小型结果集(您可以在 where 子句中对其进行限制),可以使用 HQL,除非您有大型 BLOB 和 CLOB。由于结果集很小,因此是否选择所需的字段并不那么重要(显然您可以这样做,但如果缺少某些数据,其他团队成员可能会出乎意料)。
对于大型数据集,HQL 没有意义。