【问题标题】:How to retrieve values using FetchType.Eager?如何使用 FetchType.Eager 检索值?
【发布时间】:2013-08-09 13:31:50
【问题描述】:

我有三个班级,即乡村、州和郊区。每个国家都有很多州,每个州都有很多郊区。

我的休眠是 4.2.1.Final。

问题是,虽然 FetchType of states 被定义为 EAGER,但我无法检索每个州的郊区。

我也读过这个answer。因为我不想在检索国家/地区时检索所有州和郊区。所以我想需要使用标准而不是使用
来覆盖获取策略 @LazyCollection(LazyCollectionOption.FALSE)

国家

@Entity
public class Country {
 private List<States> states;
 ...
 public Country(){
  this.states = new ArrayList();
 }

 @OneToMany (cascade = CascadeType.ALL)
 public List<States> getStates() {
   return states;
 }
  ....
}

国家

@Entity
public class States {
  private long id;
  private String name;
  private List<Suburbs> suburbs;
  ...

  public States(){
   this.suburbs = new ArrayList();
  }

  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  public List<Suburbs> getSuburbs() {
    return suburbs;
  }
}

郊区

@Entity
public class Suburbs {
  private long id;
  private String name;
  ....
}

代码

Criteria criteria = session.createCriteria(Country.class, "country")
                        .createAlias("country.states", "states");
                ProjectionList pl = Projections.projectionList();
                pl.add(Projections.property("states.id").as("id"));
                pl.add(Projections.property("states.name").as("name"));
                criteria.setProjection(pl);

                criteria.setResultTransformer(new 
                             AliasToBeanResultTransformer(States.class));

                criteria.add(Restrictions.eq("country.id", id));

                List<States> statesList = new ArrayList();
                statesList = (List<States>) criteria.list();
                System.out.println(">>>" 
                            + statesList.get(0).getSuburbs().size()); 
                              >>>>> returns Zero

【问题讨论】:

  • 我对 AliasToBeanResultTransformer 非常陌生,但有人告诉我,我需要为我想在 bean 中设置的所有字段创建一个投影,但不要相信我的话,我可能会非常糟糕错了。
  • @GabrielNetto 我已经尝试过了,但遇到了一个异常,提示“在 com.project.States 类上找不到郊区名称的设置器”

标签: java hibernate jakarta-ee jpa hibernate-mapping


【解决方案1】:

灵感来自 thislink

User user = (User) session.createCriteria(User.class)
            .setFetchMode("permissions", FetchMode.JOIN)
            .add( Restrictions.idEq(userId) )
            .uniqueResult();

【讨论】:

  • 当它返回列表并且我试图访问运行中的状态时“...无法初始化代理 - 无会话”异常
  • 试试criteria.setFetchMode("states",FetchMode.SELECT)
  • 尝试在郊区设置 FetchMode,我确实设法通过设置 fetchMode 在我正在处理的项目上解决了这个问题,但是假设您的关联成功,您可以使用 State.class 进行相同的搜索双向。有人告诉我的另一件事是,它始终应在关联的双方中保留引用。
  • 试过 setFetchMode("states",FetchMode.JOIN) 但遇到“无法初始化代理 - 无会话”异常
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2014-06-01
  • 2021-03-13
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多