2

假设我有以下两个具有一对一关系的 JPA 实体

@Entity
public class Foo {
  @Id 
  private Integer id; 

  @Column(...)
  private String data;
}

@Entity
public class Bar {
    @Id 
    private Integer id; 

    @OneToOne(fetchType=LAZY)
    @JoinColumn(name="foo_fk")
    private Foo foo; 

    @Column(...)
    private String x; 

    @Column(...)
    private String y; 
}

我想要做的是找到所有符合某些搜索条件的 Bar 实体,例如SELECT Bar b FROM Bar WHERE b.x = :xValue我想要做的是迭代结果集并提取 foo 的主键和值 y 即代码沿线。

List<Bar> results = // query to get all the results that meet value x 
for(Bar bar: results) {
    String x = bar.getX();
    String y = bar.getY();
    Integer fooId = bar.getFoo().getId(); // at this point Hibernate pulls back foo from the db 
    // do something with x,y and fooId 
 }

我想避免的是让 ORM 在我做的时候发出一个 SELECT bar.getFoo().getId() 。我知道我可以按照以下方式进行报告查询SELECT new com.example.MyResult(b.x,b.y,b.foo.id) FORM Bar b WHERE b.x = :xValue

有没有办法在bar.getFoo().getId()不编写报告查询的情况下避免选择?我正在使用 Hibernate 3.6.10 和 JPA 2 如果它可以做我想做的事,我很高兴升级到 Hibernate 4.1.x。

4

2 回答 2

2
SELECT b.foo.id FROM Bar b WHERE b.x = :something

这将只为您提供 ID,但不能保证 ORM 层将如何获取它们。如果您想绝对控制本机查询,请自己编写它们。

于 2012-08-16T21:58:31.210 回答
0

来自 Bar的foo关联显然很懒惰,让它变得急切会有所帮助。

于 2012-11-07T07:32:17.333 回答