4

ハイバネート基準のためにデフォルトで構築されている「select * from A」を避けるために、より小さなSQLを構築しようとしています。

「トランスフォーマー」を介して単純なフィールド(関係なし)を使用すると、次のSQLを管理できます。

select description, weight from Dog;

こんにちは、私はこのエンティティを持っています:

@Entity
public class Dog
{
   Long id;
   String description;
   Double weight;
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinColumn(name = "person_id", nullable = false)
   Person owner;
}

@Entity
public class Person
{
   Long id;
   String name;
   Double height;
   Date birthDate;
}

私の目標はこれを持つことです:

select description, weight, owner.name from Dog

基準(および下位基準)でこれを試しました:

Criteria dogCriteria = sess.createCriteria(Dog.class);
ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("description"), description);
proList.add(Projections.property("weight"), weigth);
dogCriteria.setProjection(proList);

Criteria personCriteria = dogCriteria.createCriteria("owner");
ProjectionList ownerProList = Projections.projectionList();
ownerProList.add(Projections.property("name"), description);    
dogCriteria.setProjection(ownerProList);  //After this line,  debugger shows that the
                                          //projection on dogCriteria gets overriden
                                          //and the query fails, because "name" is
                                          //not a field of Dog entity.

プロジェクションを使用して、より小さな SQL を取得し、列を減らすにはどうすればよいですか? 前もって感謝します。

4

2 に答える 2

4

初めに、

select description, weight, owner.name from Dog

は有効な SQL ではありません。それは次のようなものでなければなりません

select description, weight, Person.name
 from Dog join Person on Dog.person_id = Person.id

代わりは。第二に、なぜですか?やりたいことを実行することは可能ですが (以下を参照)、Criteria API を介して行うのは非常に冗長であり、何も表示されません。いくつかの列のデータ転送の節約は、その列が巨大なブロブであるか、数十万のレコードを選択していない限り、ごくわずかです。どちらの場合でも、この問題に対処するためのより良い方法があります。

とにかく、条件に必要なことを行うには、エイリアスを介してリンクされたテーブル (Person) に参加し、そのエイリアスを使用して主な条件で射影を指定する必要があります。

Criteria criteria = session.createCriteria(Dog.class, "dog")
 .createAlias("owner", "own")
 .setProjection( Projections.projectionList()
   .add(Projections.property("dog.description"))
   .add(Projections.property("dog.weight"))
   .add(Projections.property("own.name"))
 );

Criteria Projections documentationに上記の説明と例があります。上記の条件を実行すると、オブジェクト配列のリストが返されることに注意してください。結果を実際のオブジェクトに変換するには、 ResultTransformerを指定する必要があります。

于 2009-10-24T18:49:31.990 に答える