2

好的,我有一个带有 List 成员的实体类,它通过 Hibernate 映射到大量对象。我不需要在查询时获取整个列表,我只需要这适用的对象的总大小。

  • List 还使用@Where注释来仅选择元素的子集。
  • 列表被标记为 @LazyCollection(LazyCollectionOption.EXTRA)由于其非常大
  • 映射是通过使用链接表完成的
  • List 具有以下类型的映射:

在此处输入图像描述

列表的@JoinTable使用表 2 上的连接和表 3 上的反向连接。我不完全确定生成的 SQL 是什么,因为我不太熟悉 SQL。

无论如何, @Where子句会对它有一些限制,例如'STATUS = ACTIVE'和可能的其他一些东西,例如'LETTER = 'A'。如示例所示,如果我进行这样的调用:

列表项 = Lists.getItems();
物品尺寸();// 这导致 1 带有 @Where 子句的限制

以上使用表 3 中的正确项目填充项目,并受到 @Where 子句的限制。我在不获取整个列表的情况下尝试的第一件事是:

int listSize = Lists.getItems().size(); // 这导致 3,@Where 子句没有被应用

我对其进行了研究,发现 Hibernate 的这个问题我认为尚未解决:Hibernate Jira


所以,我的问题是最好的方法是什么?我还不是很精通 SQL 或 HQL。我对连接和其他数据库术语不太熟悉,所以如果可以提供任何支持,那就太好了。

谢谢!

4

1 回答 1

1

我最终做了以下查询并设置了参数:

public int getActiveCountOfList(long list_id) {
    String sql = "SELECT COUNT(*) FROM TABLE_2 t2 
                 LEFT JOIN TABLE_3 t3 ON t2.ITEM_ID = t3.ITEM_ID 
                 WHERE t2.LIST_ID = :list_id AND t3.LETTER IN ('A', 'B')
                 AND t3.STATUS = 'ACTIVE'";

    Object result = session.createSqlQuery(sql).setLong("list_id", list_id)
                       .uniqueResult();

    return ((Number) result).intValue();
}
于 2012-12-25T02:49:18.027 回答