Hibernate 带有连接条件的HQL更新
我在hibernate中的实体之间有一个关系 实体程序卡实体:Hibernate 带有连接条件的HQL更新,hibernate,join,hql,Hibernate,Join,Hql,我在hibernate中的实体之间有一个关系 实体程序卡实体: @Entity @Table(name = "ProgramCardEntity") public class ProgramCardEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "ParentCardRef", referencedColumnName = "id") private VSCardEntity parentCa
@Entity
@Table(name = "ProgramCardEntity")
public class ProgramCardEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "ParentCardRef", referencedColumnName = "id")
private VSCardEntity parentCardEntity;
@Column(name = "Status")
private String status;
}
实体VSCardEntity
@Entity
@Table(name = "VSCardEntity")
public class VSCardEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "CardNumber")
private String cardNumber;
}
我想更新给定VSCardEntity卡号上ProgramCardEntity的状态
我正在尝试使用HQL查询执行此操作:
String query = "update ProgramCardEntity pc inner join pc.parentCardEntity as progCard set pc.status= :status where progCard.cardNumber = :cardNo";
Query qry = this.sessionFactory.getCurrentSession().createQuery(query);
qry.setParameter("status", "Issued");
qry.setParameter("cardNo", "cardNo");
int updated = qry.executeUpdate();
这会产生以下错误:
org.hibernate.hql.internal.ast.QuerySyntaxException: expecting "set", found 'inner' near line 1, column 45 [update ProgramCardEntity pc inner join pc.parentCardEntity as progCard set pc.status= :status where progCard.cardNumber = :cardNo]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:91)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:109)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:304)
您应该使用子查询而不是联接,如下所示:
"update ProgramCardEntity pc set pc.status = :status where pc.id in
(select progCard.id from pc.parentCardEntity as progCard where
progCard.cardNumber = :cardNo)"
尝试此查询可能会起作用:
update ProgramCardEntity pce set pce.status=: status where pce.parentCardEntity.cardNumber=: cardNumber
您不能在更新查询中使用联接。通常,您不应该使用更新查询。获取实体,修改其状态。状态很可能应该是枚举,而不是字符串。