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.

Сказав это, означает, что нет разницы между двумя первыми двумя фрагментами кода, опубликованными в вашем вопросе. Вы должны использовать Property.forName("propName"), если вам нужно использовать это свойство несколько раз в Критерии или Запрос. Это эквивалентно использованию прямого номера. (e.g. 11) или с помощью переменной, присвоенной no. (e.g. int x = 11) и использовать переменную каждый раз, когда вам нужно использовать no.

Для получения дополнительной информации см. this.

Теперь, если я говорю о 2-м вопросе (3-й & 4-й фрагмент кода), работа между обоими одинакова. Единственное различие заключается в использовании API.

В 3-й фрагмент кода, вы получаете экземпляр Property, вызывая метод as(), который используется для создания псевдонима для этого определенного свойства и возвращает экземпляр SimpleProjection (subclass of Projection).

В четвертом фрагменте кода вы получаете экземпляр PropertyProjection (subclass of Projection), делая Projections.property("Name").

Итак, в обоих случаях вы получаете экземпляр Projection, который вы добавляете к ProjectionsList. Теперь ProjectionList имеет 2 перегруженных метода, называемых add(). В третьем фрагменте кода вы вызываете add(), который принимает только аргумент Projection. В четвертом фрагменте кода вы вызываете другую версию add(), которая принимает экземпляр Projection как первый аргумент & alias for the property of Projection как второй аргумент. Так что в конечном итоге работа обоих одинакова.

+0

Итак, в третьем фрагменте, когда я вызываю метод 'add (Projection)', я также предоставляю информацию псевдонима. И в 4-м фрагменте im, предоставляя информацию псевдонима, вызывая метод 'add (Projection, alias)'. Это правильно? – insanity

+0

Псевдоним передается в обоих случаях. Используемый API отличается. Вы можете указать псевдоним свойства двумя способами: 1. используя 'Property.as (" aliasName ")' 2. используя 'ProjectionList.add (projection, aliasName)'. – RAS

Смежные вопросы