hibernate - 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;
}
我究竟做错了什么?谢谢你。
解决方案
这可能是问题: 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')")
推荐阅读
- sql - 在 BigQuery 标准 SQL 中按时间戳值的前 4 位进行过滤
- jquery - JQueryUI Dialog插入文本的方式
- sql-server - 报表生成器:如何同时设置多个文本框的高度
- .net - Linq GroupJoin 与多表
- ag-grid - Ag-grid Master/Detail 组件更改高度
- python - 在多个文件中搜索多个正则表达式,然后输出每个匹配项及其各自的文件
- intellij-idea - 如何在 intellij 的 Native Code 中导航库?
- node.js - 在猫鼬中填充引用到其他字段而不是_id,引用自定义字段而不是_id
- java - 将 SAAJ 模型写入流式传输时出现问题:无法创建 MessageFactory:找不到 javax.xml.soap.MessageFactory 的提供程序
- typeorm - 类型ORM 多态关系