【问题标题】:Need help optimizing HQL to reduce columns returned需要帮助优化 HQL 以减少返回的列
【发布时间】:2017-07-29 22:43:40
【问题描述】:

我在下面有一个 HQL: from ProductMain as pm join fetch pm.person as ps join fetch pm.personProduct as pp join fetch pm.personReturn as pr join fetch pp.personObjects as po where pp.id in (180,000) and ps.id >= :lowRange and ps .id

似乎当我查询数据库时,我得到了每一列,这让我从数据库中得到一个 904 错误......有没有办法让特定的列返回以减小结果的大小? 就像如果我返回 100K 结果,每列有 100 列,我只想要返回 10 列.... 谢谢!

【问题讨论】:

  • 有什么阻止你使用select,例如select pm.col1, pm.col2 from ProductMain as pm ... ?
  • 我可以这样做吗?所以我只是使用 ProductMain 中的 select pm.col1 , pm.col2 as pm join fetch pm.person as ps join fetch pm.personProduct as pp j 等?另外,假设还有其他与 ProductMain 链接的表,如 Car、House 等,我只需要它们的几列......我该如何实现?

标签: hibernate hql


【解决方案1】:

Error-904 由于资源不可用导致执行不成功。 REASON 原因代码、TYPE OF RESOURCE 资源类型和 RESOURCE NAME 资源名称....那么它与您的查询有何关系,您需要了解。

关于仅获取所需属性是的,您可以这样写:-

SELECT pm.col1, 
       pm.col2 
FROM 
from   ProductMain as pm 
JOINFETCH pm.person AS ps 
JOINFETCH pm.personproduct AS pp 
JOINFETCH pm.personreturn AS pr 
JOINFETCH pp.personobjects AS po 
WHERE pp.id IN (180,000) 
AND   ps.id >= :lowRange 
AND   ps.id <= :highRange

【讨论】:

  • 我认为的问题是该表有一百列,当我得到结果时,它会使资源区域超载。所以我认为如果我可以指定一些我需要的列,那么它会减少问题吗?
  • 我认为的问题是该表有一百列,当我得到结果时,它会使资源区域超载。所以我认为如果我可以指定我需要的几列,那么它会减少问题吗?我假设如果我针对特定列返回结果,它仍然可以映射到 Hibernate 对象吗?其他任何表连接呢?如果 ProductMain 有其他指向具有 100 列的表的链接,我如何限制它们返回的列?
  • 那么返回的对象是 ProductMain 对象还是只是包含我想要的那些行的对象列表?我想使用映射为结果的休眠对象。
【解决方案2】:

如果有人像我一样偶然发现这个问题,我发现这篇关于 Hibernat 最佳实践的有趣博文:https://www.thoughts-on-java.org/hibernate-best-practices/

参见章节“1.2 Pojo”:回答上面 cmets 部分中的问题:是的,您可以只选择单个列并将它们传递给 Pojo 的构造函数,该构造函数可以是相同的实体,但具有另一个构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多