首页 > 解决方案 > Spring JPA 存储库为更新子句生成错误的本机查询

问题描述

我正在尝试使用以下方法更新我的实体列:

@Modifying
@Query("update Person person set person.hixNumber = :hixNumber , "
        + "fixNumber.fixNumber = :fixNumber where person.role.type = 'ADMIN'")
int updatePersonByRole(@Param("hixNumber ") int hixNumber , @Param("fixNumber ") int fixNumber);

此方法给出异常原因:

引起:org.postgresql.util.PSQLException:错误:“交叉”处或附近的语法错误

因为生成的原生查询是错误的:

update person cross join set hix_humber=?, set fix_humber=? where type=?

我的 Person 实体类如下所示:

@Getter
@Setter
@Entity
@NoArgsConstructor
public class Person {

    @EmbeddedId
    private PersonId personId;

    @MapsId("roleId")
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "role_id", insertable = false, updatable = false)
    private Role role;

    @MapsId("storeId")
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "store_id", insertable = false, updatable = false)
    private Store store;

    private int hixNumber;

    private int fixNumber;
}

和主键实体:

@Getter
@Setter
@EqualsAndHashCode
@Embeddable
public class Personid implements Serializable {

    private Long roleId;

    private Long storeId;
}

我究竟做错了什么?谢谢你。

标签: hibernatejpaspring-data-jpajpqlspring-repositories

解决方案


这可能是问题: where person.role.type = 'ADMIN'"
person是一个实体和role另一个。当您将该where子句应用于实体关系的字段时,这意味着您要求 JPA 执行 and 之间的person连接role。问题是您不能join在更新 JPA 查询中使用。

一些您可能感兴趣的 SO 参考资料:

要绕过该限制,您应该使用不是连接但在此上下文中有效的子查询。例如类似的东西:

@Query("update Person person set person.hixNumber = :hixNumber , "
        + "fixNumber.fixNumber = :fixNumber where " 
        + "person.roleId in (select r.roleId from role r where r.type = 'ADMIN')")

推荐阅读