【问题标题】:HQL update with join condition使用连接条件更新 HQL
【发布时间】:2019-01-19 09:25:20
【问题描述】:

我在休眠中的实体之间有关系,

实体ProgramCardEntity

@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)

【问题讨论】:

  • 您不能在更新查询中使用联接。通常,您不应该使用更新查询。获取实体,修改其状态。状态很可能也应该是枚举而不是字符串。

标签: hibernate join hql


【解决方案1】:

您应该使用子查询而不是联接,如下所示:

"update ProgramCardEntity pc set pc.status = :status where pc.id in
(select progCard.id from pc.parentCardEntity as progCard where
progCard.cardNumber = :cardNo)"

【讨论】:

    【解决方案2】:

    试试这个查询可能会起作用:

    update ProgramCardEntity  pce set pce.status=: status where pce.parentCardEntity.cardNumber=: cardNumber
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-26
      相关资源
      最近更新 更多