【问题标题】:How to eagerly fetch a single "default" entity from a collection in EJB3/JPA如何从 EJB3/JPA 中的集合中急切地获取单个“默认”实体
【发布时间】:2009-02-16 14:14:16
【问题描述】:

我有一个带有多个电话号码的 Person 实体。

 @OneToMany(mappedBy="person", cascade=CascadeType.ALL)
 public Set<PhoneNumberOfPerson> getPhoneNumbers() {
    return phoneNumbers;
 }

现在我想为迫切获取的 Person 实现一个“获取默认电话号码”方法。此默认电话号码是 phoneNumbers 集中的电话号码之一。有没有办法做到这一点?

我尝试实现此功能的原因是将此默认电话号码列在列出数据库中“所有”人员的页面上。

作为一名 JPA 初学者,我最初尝试使用以下方法:

@Transient
public PhoneNumberOfPerson getDefaultPhoneNumber(){
    if(this.getPhoneNumbers().size()==0)
        return null;

    return this.getPhoneNumbers().iterator().next();

}

但这当然会导致列表页面非常缓慢。

那么有什么方法可以定义一个瞬态属性,该属性根据某些查询从实体集合中获取单个实体?我使用 Hibernate 作为我的持久性提供程序。

【问题讨论】:

    标签: hibernate jpa ejb-3.0 entity-relationship one-to-many


    【解决方案1】:

    您最好的选择可能是在 PhoneNumbers 表中设置一个字段来指示它是默认号码,然后对返回 Person(s) 的查询执行 JOIN FETCH。

    select p from Person p JOIN FETCH p.phoneNumbers as ph where ph.default = true
    

    如果一个人可能没有电话号码,则使用左连接。

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 1970-01-01
      • 2016-02-19
      • 2011-06-24
      • 2011-12-16
      • 2011-04-03
      • 2023-03-23
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多