在不从数据库中提取实体的情况下获取JPA中实体的id?

时间:2012-08-16 21:06:13

标签: java hibernate java-ee jpa

假设我有以下两个具有一对一关系的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在我bar.getFoo().getId()时发出SELECT 。我知道我可以按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,如果它可以做我想要的。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

Bar的foo关联显然是懒惰的,让它急切的帮助。