HQL: объединить вставку в выбор с фиксированными значениями параметров

У меня есть оператор HQL:

insert into Item (ost, value, comments, startTime, endTime, proposedBy) 
select si.ost, si.value, si.comments, si.endTime, si.endTime, u 
from Item si, User u 
where si.ost = ? and u.id = ?

Как его можно изменить, чтобы использовать значения параметров для столбцов ost и startTime, при этом беря другие столбцы из select?


person Timur Yusupov    schedule 29.09.2010    source источник


Ответы (3)


Невозможно сделать в HQL; он не допускает ссылки на параметры в предложении select.

person bogdanb    schedule 13.12.2011
comment
У вас есть ссылка на это? - person Maarten van Leunen; 19.12.2011

Я не знаю насчет последнего ответа. Я использую NH 3.2, и я смог заставить это работать

var hql = @"INSERT INTO EventFacility (Facility, Event, Owner, Position) 
SELECT f, :evt, :own, :position from Facility f where f.Id IN (105, 109, 110)";

var @event = Session.Get<Event>(351931);
var query = Session.CreateQuery(hql)
                .SetInt32("position", 0)
                .SetEntity("evt", @event)
                .SetEntity("own", @event.Owner);

var x = query.ExecuteUpdate();
Assert.AreEqual(3, x);

В этом примере мне нужно было создать новый объект EventFacility. Почти со всеми полями, которые вы видите здесь. Сущность Event имеет другую сущность, Owner, которая висит на ней.

person NYCChris    schedule 19.03.2012

Мы можем сделать это, используя setParameter и обратитесь к пример 6 Руководства пользователя HQL и JPQL. Кроме того, ? следует заменить именованным параметром, поскольку устаревшие параметры запроса (?) больше не поддерживаются после Hibernate 5.3. (Для лучшей удобочитаемости и удобства обслуживания следует использовать именованный параметр, даже если вы используете более раннюю версию)

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

public void insertIntoSelectWithParameter(String ost, LocalDateTime startTime, String fromOst, Integer fromUserId) {
    String hql = "insert into Item (ost, value, comments, startTime, endTime, proposedBy) "
            + "select :ost, si.value, si.comments, :startTime, si.endTime, u " 
            + "from Item si, User u "
            + "where si.ost = :fromOst and u.id = :fromUserId";
    Session session = entityManager.unwrap(Session.class);
    Query<?> query = session.createQuery(hql);
    query.setParameter("ost", ost);
    query.setParameter("startTime", startTime);
    query.setParameter("fromOst", fromOst);
    query.setParameter("fromUserId", fromUserId);
    query.executeUpdate();
}
person samabcde    schedule 05.10.2020