JPA - 更新嵌入式实体会生成无效的 SQL

Posted

技术标签:

【中文标题】JPA - 更新嵌入式实体会生成无效的 SQL【英文标题】:JPA - updating an embedded entity generates invalid SQL 【发布时间】:2012-12-15 17:43:15 【问题描述】:

我正在尝试更新一个嵌入式实体,而 JPA 似乎生成了错误的 SQL。

我有一个带有嵌入式徽标实体的公司实体

@Entity
public class Company 

  private Long id;
  @Embedded
  private Logo logo;

  // Omitted other fields, getters, setters, etc



@Embeddable
public class Logo 

  private String fileName;
  private String fileExtension;
  private String imageDataType;

  // Omitted getters and setters

在我的 DAO 方法中,我尝试像这样更新嵌入的徽标:

@Override
public void setLogo(Logo logo, Long companyId) 
    String q = "update Company c SET c.logo = :logo where c.id = :companyId";
    Query query = entityManager.createQuery(q);
    query.setParameter("companyId", companyId);
    query.setParameter("logo", logo);
    query.executeUpdate();

JPA(实际上是 Hibernate)生成以下 SQL。

update px_company set file_extension, file_name, file_type=(?, ?, ?) where id=?

Hibernate 似乎明白它必须更新三个嵌入的徽标字段,但它会为它生成无效的 SQL。生成的 SQL 导致错误。

You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near ' file_name, file_type=('jpg', '7679075394', 0) where id=1' at line 1

知道我应该如何更新嵌入的实体吗?

【问题讨论】:

【参考方案1】:

有点老了,但也遇到了同样的问题 - 您应该完全解析 JPQL 中嵌入类的属性:

update Company c
SET c.logo.fileName = :fileName
    ,c.logo.fileExtension = :fileExtension
    ,c.logo.imageDataType= :imageDataType
where c.id = :companyId

【讨论】:

以上是关于JPA - 更新嵌入式实体会生成无效的 SQL的主要内容,如果未能解决你的问题,请参考以下文章

JPA:如果孩子有嵌入式ID,如何级联保存实体?

JPA 多个嵌入式字段

Spring Data JPA 通过嵌入对象属性查找

学习Spring-Data-Jpa---可嵌入对象和元素集合的使用

从一个视图映射具有嵌入式List的实体

JPA Map映射