我有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
列的参数值?
答案 0 :(得分:0)
无法在HQL中完成;它不允许在select子句中引用参数。
答案 1 :(得分:0)
我不知道最后的答案。我正在使用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实体有另一个实体,所有者挂起它。
答案 2 :(得分:0)
我们可以使用setParameter方法并参考example 6 of HQL and JPQL User Guide。
此外, ”?”在Hibernate 5.3之后,应使用Legacy-style query parameters (?
) are no longer supported将其替换为“命名参数”。 (为了获得更好的可读性和可维护性,即使您使用的是早期版本,也应使用命名参数)
以下方法演示了上述更改:
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();
}