Hibernate生成不正确的更新语句

时间:2016-07-28 12:48:24

标签: java hibernate

我有这个:

String hql = "UPDATE User u SET u.externalId = u.id WHERE u.directory.name = 'MySuperAwesomeName' AND u.externalId = null";
    Query query = session().createQuery(hql);
    query.executeUpdate();

Hibernate抛出Exception说:

Unexpected token JOIN, requires SET in statement [update user cross join  set external_id=id where name='MySuperAwesomeName' and (external_id is null)]

请帮我指出我做错了什么。

用户实体的映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.User" table="user" lazy="true">
        <id name="id" column="id" unsaved-value="null">
            <generator class="com.example.MySuperAwesomeGenerator"/>
        </id>
        <property name="name" column="user_name" type="string" not-null="true" length="255"/>
        <property name="externalId" column="external_id" type="string" not-null="false" length="255" index="idx_external_id"/>
        <many-to-one name="directory" column="directory_id" not-null="true" foreign-key="fk_user_dir_id" unique-key="uk_user_name_dir_id" class="com.example.DirectoryImpl"/>
    </class>
</hibernate-mapping>

1 个答案:

答案 0 :(得分:0)

答案可能是将此查询更改为带有小子查询的查询

UPDATE User u SET u.externalId = u.id WHERE u.directory.id IN (SELECT d.id FROM DirectoryImpl d where d.name = 'MySuperAwesomeName') AND u.externalId = NULL

有效。