2015-03-02 3 views
2

Я пытаюсь получить количество строк для заданных критериев с помощью проекции. Идея состоит в том, чтобы подсчитать все предметы, чей владелец из указанного города.Сортировка строк с использованием критериев и прогноза

Сущность структура выглядит следующим образом:

@MappedSuperclass 
class BaseEntity implements Serializable { 
    @Expose 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    Long id; 
} 

class Item extends BaseEntity{ 
    @ManyToOne 
    @JoinColumn(name = 'owner_id') 
    Owner owner; 
} 

class Owner extends BaseExntity{ 
    @ManyToOne 
    @JoinColumn(name = "city_id") 
    City city; 
} 

class City extends BaseExntity{ 
    @Column(name = "name") 
    String name; 
} 

Для выбора данных я использую следующий код с критериями Hibernate:

Criteria c = session.createCriteria(Item.class); 

//just select all instances that have cityId = 1 
c.createAlias("owner.city", "city"); 
c.add(Restrictions.like("city.id", 1L)); 
c.list(); //1st invocation, this works well 

//Trying to count instances that have cityId = 1 
ProjectionList properties = Projections.projectionList(); 
properties.add(Projections.rowCount(), "count"); 

c.setProjection(properties); 
c.list(); //2nd invocation, here I receive an exception - object not found: CITY1_.ID 

На втором c.list() вызова SQL-запрос выглядит следующим образом: Hibernate: выберите count (*) как y0_ из item this_, где city1_.id нравится?

И это не для меня ясно, почему первый c.list() вызов работает хорошо, но когда я пытаюсь посчитать строки с проекцией он не работает и бросает объект не найден: CITY1_.ID

Hibernate версия 4.3.4.Final

+0

Что произойдет, если вы вызываете 'c.list();' только один раз? – JamesENL

+0

Если я удаляю первый вызов c.list(), он терпит неудачу с той же ошибкой - объект не найден: CITY1_.ID – igor

+0

Я думаю, вам нужно добавить псевдоним к проекции с помощью метода 'Projections.alias'. – JamesENL

ответ

1

Решено: Похоже, спящий режим не поддерживает псевдонимы с несколькими ассоциациями проекциях, но Criteria делает. Таким образом, я изменил критерии псевдоним из:

Criteria c = session.createCriteria(Item.class); 
c.createAlias("owner.city", "city"); 
c.add(Restrictions.like("city.id", 1L)); 

к:

Criteria c = session.createCriteria(Item.class, "i"); 
c.createAlias("i.owner", "owner"); 
c.createAlias("owner.city", "city"); 
c.add(Restrictions.eq("city.id", 1L)); 

и теперь граф Проекция работает хорошо.

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