JPQL - 更新外键id而无需不必要的选择

时间:2014-12-20 10:24:00

标签: java hibernate jpa jpql

我有以下数据库架构:

create table country (
  id integer primary key
);

create table city (
  id integer primary key, 
  country_id integer references country
);

和映射:

@Entity
class Country {
    @Id private Integer id;
    ...
}

@Entity
class City {
    @Id private Integer id;
    @ManyToOne private Country country;
    ...
}

现在我有countryIdcityId。我需要更新表城并更改它的国家/地区。我会在SQL中做类似的事情:update city set country_id = :countryId where id = :cityId

我可以用类似语法的JPQL更新简单属性。但是如何在上面的例子中更新外键引用呢?

当然我可以通过id获取相应的实体并更新java实体,比如

City city = em.find(cityId, City.class);
Country country = em.find(countryId, Country.class);
city.setCountry(country);

但是此代码将发出2个不必要的选择。我想避免这种情况。

2 个答案:

答案 0 :(得分:2)

我相信EntityManager.getReference()方法仅用于此目的。 见javadoc

答案 1 :(得分:1)

我找到了解决方案。这看起来很简单。只需创建新的实体对象,初始化其id并将其作为参数传递给JPQL更新查询:

Country country = new Country();
country.setId(countryId);
Query query = em.createQuery("update City set country = :country where id = :cityId");
query.setParameter("country", country);
query.setParameter("cityId", cityId);
query.executeUpdate();

显然,JPA不关心是从数据库检索country对象还是手动创建,只需要设置id属性。