在Hibernate HQL更新查询中使用JOIN

19

我有以下的Hibernate映射:

 <class name="Domain.Roomreservation, Core" table="Reservationroom">
    <id name="ID" unsaved-value="undefined">
        <generator class="native">
            <!--<param name="sequence">GLOBALSEQUENCE</param>-->
        </generator>
    </id>

    <property name="FromTime" not-null="true" index="IDX_RESRAUM_FromTime" />
    <property name="UntilTime" not-null="true" index="IDX_RESRAUM_UntilTime"/>

    <many-to-one name="Booking" column="Book_ID" index="IDX_RAUMRES_BOOK" lazy="false"
        class="Domain.Booking, Core" not-null="true" />
    </class>

而且Reservationroom表看起来像这样:

ID         <pk>
Book_ID    <fk>
FromTime
UntilTime
....
....

我使用的 Hibernate 查询如下:

String hql = "UPDATE Roomreservation as rr set rr.FromTime= 12:15" +
                     "Inner Join Booking b ON rr.Book_ID= b.ID " +
                     "Where b.ID = 95637";
                        IQuery query = CurrentSession.CreateQuery(hql);
                        int result = query.ExecuteUpdate();
                        Debug.WriteLine("Rows affected: " + result);

但我总是收到 Error: NHibernate.Hql.Ast.ANTLR.QuerySyntaxException 的错误。

有人可以帮助我如何使其正常工作吗?

2个回答

29

您需要使用子查询而不是连接查询。大致如下:

UPDATE Roomreservation as rr set rr.FromTime= 12:15
WHERE rr.Book_ID IN (
  SELECT b.id 
  FROM Booking b 
  WHERE b.id = 95637);

另外,根据 FromTime 的类型,它很可能需要以其他格式呈现。


1
难道没有自然的方法可以不使用子查询吗?这两者之间有什么区别呢? - Adelin
@Adelin,如果你在Hibernate中使用映射注释,这可能是可行的。 - Shawn

-5

这个缺失的单引号 rr.FromTime= '12:15' 应该是错误的原因。

String hql = "UPDATE Roomreservation as rr set rr.FromTime= '12:15' " +
"Inner Join Booking b ON rr.Book_ID= b.ID " +
"Where b.ID = 95637";

你能帮我检查一下吗?


rr.FromTime= '12:15'" + " Inner。为此,我们还需要留出空间。 - Ramaraj Karuppusamy
4
Hibernate 不支持在 Update/Delete 语句中使用 Join。 - Sanghyun Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接