2

1対1の関係を持つ次の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 ie code の行に沿ってコードを抽出します。

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レイヤーがIDを取得する方法については保証されません。ネイティブクエリを完全に制御したい場合は、自分で記述してください。

于 2012-08-16T21:58:31.210 に答える
0

Bar からのfoo関連付けは明らかに怠惰であり、熱心にすることが役立ちます。

于 2012-11-07T07:32:17.333 に答える