Преобразовать HQL-запрос в виде «select foo from Foo foo, Bar bar where ...» в запрос критерия - PullRequest
0 голосов
/ 04 октября 2019

В нашем (древнем) проекте мы используем множество запросов на выборку с HQL в Hibernate версии 3.5.6-Final. Поскольку Hibernate будет выполнять автоматическую фиксацию, поскольку он не знает, что это запросы выбора, я переписываю все запросы выбора HQL в запросы Hibernate Criteria, поэтому он не выполняет промежуточные коммиты, когда мы непока не хочу. В большинстве случаев это довольно просто, но в настоящее время я смотрю на такой запрос, и я не уверен, как его преобразовать:

Query query = session.createQuery("select municapilityStreet"
  + " from MunicapilityStreet munStreet, Street street"
  + " where munStreet.id = street.MunicapilityStreet.id"
  + " and street.id = :streetId");
query.setParameter(":streetId", streetId);
MunicapilityStreet result = (MunicapilityStreet) query.uniqueResult();
return result;

Вот что я пока имею впроцесс его преобразования:

Criteria criteria = session.createCriteria(MunicapilityStreet.class);

// No idea what to set here to only get the "municapilityStreet" as result
criteria.setProjection(??);

// I'm not sure if this is correct. With a criteria on a single table it would have been simply "Id".
// Both tables have the column-name Id, and I'm not sure how to differentiate between them.
criteria.add(Restrictions.eq("Street.Id", streetId));

MunicapilityStreet result = (MunicapilityStreet) criteria.uniqueResult();
return result;

Возможно, мне следует создать отдельный вопрос для каждого, но преобразование вышеупомянутого запроса HQL в критерии имеет три момента, которые я не уверен в том, как это сделать:

  1. Как сделать выборку с несколькими таблицами (часть from MunicapilityStreet munStreet, Street street)?
  2. Как получить проекцию, чтобы вернуть только одну таблицу из двух (часть select municapilityStreet)?
  3. Как получить равное ограничение на имя столбца одной таблицы, даже если обе таблицы имеют одинаковое имя столбца (часть and street.id = :streetId)?

1 Ответ

1 голос
/ 04 октября 2019

Я против подхода переписывания, я надеюсь, что я не невежлив, делая это.

Hibernate позволяет контролировать коммиты (автокоммит по умолчанию выключен), и вы испытываете, что это Entitymanager-сброс, по умолчанию они автоматические и могут быть отключены тоже . И, наконец, я думаю, что нет никакой разницы, если вы используете запросы HQL или критерии, то же оборудование под ними.

...