【问题标题】:JPQL query for updating an object用于更新对象的 JPQL 查询
【发布时间】:2020-07-03 19:46:38
【问题描述】:

我正在尝试使用 jpql 更新名为 endDate 的变量,该变量属于 LocalDate 类型。我的查询如下:

@Modifying
@Query("UPDATE TeamEntity t SET t.coach.endDate = ?2 WHERE t.coach.id = ?1")
public void updateCoachEndDate(long coachId, LocalDate endDate);

TeamEntity 类的一部分如下

@Entity
public class TeamEntity{

    @ManyToOne
    @JoinColumn(name = "coach_id", nullable = true)
    private CoachEntity coach;

}

CoachEntity 类的一部分如下

@Entity
public class CoachEntity{
    @Id
    private long id;
    private LocalDate endDate
}

当我对其进行测试时,它似乎不喜欢

r.coach.endDate = ?2

它给了我以下错误

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "UPDATE Team CROSS[*] JOIN  SET END_DATE=? WHERE COACH_ID=? "; expected "., AS, SET"; SQL statement:
update team cross join  set end_date=? where coach_id=? [42001-199]

我只是想知道是否有人知道如何解决此错误。

【问题讨论】:

    标签: sql spring database jpql


    【解决方案1】:

    您的描述不匹配,即我不确定“员工”来自哪里。总之:

    Hibernate 文档说:

    不能在批量 HQL 中指定隐式或显式连接 询问。子查询可以用在 where 子句中,其中 子查询本身可能包含连接。

    您在 TeamEntity 和 Coach 之间有一个隐式连接。

    那么,下一个问题是,既然你有 coachId,为什么还要通过 TeamEntity?

    update Coach c set c.endDate = ?2 where c.id = ?1
    

    应该做的伎俩

    【讨论】:

    • 嗨,对不起,那是教练而不是员工。关于错误,我也不知道。我认为交叉连接是 jqpl 中内置的东西,当它想加入 Team 表和 Coach 表时。
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 2019-03-01
    • 1970-01-01
    • 2021-11-20
    • 2019-07-16
    • 2019-11-04
    • 1970-01-01
    • 2014-06-17
    相关资源
    最近更新 更多