2013-07-17 2 views
7

の違いは何ですか:Property.forName()を使用する時期または理由は何ですか?

List cats = session.createCriteria(Cat.class) 
.add(Restrictions.like("name", "F%") 
.list(); 

List cats = session.createCriteria(Cat.class) 
.add(Property.forName("name").like("F%")) 
.list(); 

またはそのことについては、違い:

Criteria cr = session.createCriteria(User.class) 
    .setProjection(Projections.projectionList() 
    .add(Property.forName("id").as("id")) 
    .add(Property.forName("name").as("name")) 

Criteria cr = session.createCriteria(User.class) 
    .setProjection(Projections.projectionList() 
    .add(Projections.property("id"), "id") 
    .add(Projections.property("Name"), "Name")) 

答えて

6

Property.forName("propName")は常に一致するPropertyインスタンスを返します。

これは、あなたの質問に投稿された最初の2つのコードスニペットに違いがないことを意味します。 基準またはクエリで複数回このプロパティを使用する必要がある場合は、Property.forName("propName")を使用する必要があります。直接番号を使用するのと同じです。 (e.g. 11)、またはnoに割り当てられた変数を使用します。 (e.g. int x = 11)、使用するたびに変数を使用してください。

詳細については、thisを参照してください。

ここで2番目の質問(3番目の& 4番目のコードスニペット)について言えば、両方の作業は同じです。唯一の違いは、使用されているAPIにあります。

3番目のコードスニペットでは、as()メソッドを呼び出すと、その特定のプロパティのエイリアスを生成するためのメソッドが呼び出され、SimpleProjection (subclass of Projection)のインスタンスが返されます。

4番目のコードスニペットでは、Projections.property("Name")を実行してPropertyProjection (subclass of Projection)のインスタンスを取得しています。

したがって、いずれの場合もProjectionのインスタンスが得られます。これはProjectionsListに追加されます。 ProjectionListには、add()という2つのオーバーロードされたメソッドがあります。 3番目のコードスニペットでは、引数としてProjectionのインスタンスのみを取るadd()を呼び出しています。 4番目のコードスニペットでは、別のバージョンのadd()を呼び出しています。これは、最初の引数としてProjectionのインスタンスを第2引数として& alias for the property of Projectionとしています。最終的には両方の作業が同じです。

+0

3番目のスニペットで、メソッド 'add(Projection) 'を呼び出すと、エイリアス情報も与えています。そして、4番目のスニペットでは、 'add(Projection、alias)'メソッドを呼び出すことでエイリアス情報を与えています。そうですか? – insanity

+0

エイリアス情報は両方の場合に渡されます。使用されるAPIは異なります。 1.ProjectList.add(projection、aliasName)を使って、Property.as( "aliasName") 'を使って2つの方法でプロパティにエイリアスを与えることができます。 – RAS

関連する問題