当前位置: 首页 > 面试题库 >

休眠计数集合大小,无需初始化

能远
2023-03-14
问题内容

有没有一种方法可以在不初始化的情况下计算关联集合的大小?

例如

Select count(p.children) from Parent p

(由于我的where子句更加复杂,而from子句是多态查询,所以我不能以任何其他方式执行此操作是有充分的理由的)

谢谢。


问题答案:

除查询外,可能的解决方案可能是children使用lazy="extra"(使用XML表示法)映射。这样,您可以使用所需的任何查询来获取Parent,然后在parent.getChildren().size()不加载整个集合的情况下进行调用(仅SELECT COUNT执行类型查询)。

有了注释,它将是

@OneToMany
@org.hibernate.annotations.LazyCollection(
org.hibernate.annotations.LazyCollectionOption.EXTRA
)
private Set<Child> children = new HashSet<Child>();

更新: 引用Java
Persistence与Hibernate的相关内容
,第ch。13.1.3:

如果您调用不是标识符getter方法的任何方法,就会初始化一个代理,如果您开始遍历它的元素或调用任何一个集合管理操作(例如size()和),则会初始化一个集合contains()。Hibernate提供了一个额外的设置,该设置对于大型集合最有用。它们可以映射为
额外的懒惰 。[…]

[如上所述,]如果您调用,或size(),则不再初始化集合。-查询数据库以检索必要的信息。如果它是一个或一,操作
和也直接查询数据库。contains()``isEmpty()``Map``List``containsKey()``get()

因此,使用如上所述映射的实体,您可以

Parent p = // execute query to load desired parent
// due to lazy loading, at this point p.children is a proxy object
int count = p.getChildren().size(); // the collection is not loaded, only its size


 类似资料:
  • 问题内容: 在具有两种类型的实体(父级和子级)的场景中: 父母-@OneToMany Collection孩子; 默认设置是对子级集合进行延迟加载。这种模式对少数儿童非常有效,但是如果这个数字很大,这似乎是不可持续的。因此,在某些情况下,我认为孩子的数量会很大,因此我使用了分页的服务方法(例如“ getChildren(父父母,int偏移量,int计数)”)。 问题是:这是处理此类情况的最佳方法吗

  • 问题内容: 我有下一个错误: 我的实体: 我有一个服务班: 我从另一种服务方法调用服务: 但是,当我试图调用这个方法我收到线异常,当我打电话时,也会发生同样的异常上。我已经检查了事务管理器,并且配置正确,并且此步骤中存在事务。另外,我已经检查了关于与此异常相关的stackoverflow的大量答案,但没什么用。 可能是什么原因造成的? 问题答案: 看来模型是一个独立的实体。 尝试合并并在合并实例上

  • 问题内容: 在合理的时间内从数据库中完全加载非常复杂的对象以及合理的查询数量时,我遇到了问题。 我的对象有很多嵌入式实体,每个实体都引用了另一个实体,另一个实体又引用了另一个,依此类推(因此,嵌套级别为6) 因此,我创建了示例来演示我想要的内容:https : //github.com/gladorange/hibernate-lazy- loading 我有用户。 用户有喜欢的 橙子,苹果,葡萄

  • 问题内容: 欢迎, Hibernate映射存在一些问题。 数据库结构: POJO结构: 我想拥有的是TableC Pojo映射中TableB元素的集合,映射键是tableA。 该集合应该是只读的。 映射应为hbm而非注释。 我可能已经以各种可能的方式完成了此操作…我遇到的关闭情况是,当我对一个TableC对象进行操作时,一切都是正确的,但是如果我加载它们的集合,则只有最后一个具有正确的集合集。 更

  • 问题内容: 对数据库有以下查询: 在获取employee.address.street,employee.address.houseNumber或employee.address.city时,它将失败,但以下情况除外: 员工映射: 地址映射: 对于其他类(办公室,公司等),这​​是绝对正常的。如果注释,则在jsp应用程序中加载地址字段的行将正常工作。怎么了?顺便说一下,尽管有异常,它仍显示有关js

  • {应用程序:“ABC”,日期:time.now,状态:“1”user_id:[id1,id2,id4]} {应用程序:“ABC”,日期:time.listerment,状态:“1”,user_id:[id1,id3,id5]} {应用程序:“ABC”,日期:time.ystayday-1,状态:“1”,user_id:[id1,id3,id5]} 我目前正在使用聚合框架并计算MongoDB之外的I