Я пытаюсь получить количество строк для заданных критериев с помощью проекции. Идея состоит в том, чтобы подсчитать все предметы, чей владелец из указанного города.Сортировка строк с использованием критериев и прогноза
Сущность структура выглядит следующим образом:
@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
Что произойдет, если вы вызываете 'c.list();' только один раз? – JamesENL
Если я удаляю первый вызов c.list(), он терпит неудачу с той же ошибкой - объект не найден: CITY1_.ID – igor
Я думаю, вам нужно добавить псевдоним к проекции с помощью метода 'Projections.alias'. – JamesENL