Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate SpringJPA存储库为update子句生成错误的本机查询_Hibernate_Jpa_Spring Data Jpa_Jpql_Spring Repositories - Fatal编程技术网

Hibernate SpringJPA存储库为update子句生成错误的本机查询

Hibernate SpringJPA存储库为update子句生成错误的本机查询,hibernate,jpa,spring-data-jpa,jpql,spring-repositories,Hibernate,Jpa,Spring Data Jpa,Jpql,Spring Repositories,我正在尝试使用以下方法更新实体列: @Modifying @Query("update Person person set person.hixNumber = :hixNumber , " + "fixNumber.fixNumber = :fixNumber where person.role.type = 'ADMIN'") int updatePersonByRole(@Param("hixNumber ") int hixNumber , @Param("fixNumb

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

@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.psql异常:错误:语法错误 或接近“十字架”

因为生成的本机查询错误:

更新人员交叉连接集hix\u humber=?,设置修复\u humber=?其中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;
}

我做错了什么?谢谢。

我认为问题在于,您间接地试图引用依赖实体
角色。这需要update语句中有一个
JOIN
,它在本机查询中无法很好地转换

尝试改用子查询,这样可以更好地转换为本机查询:

update Person person 
set person.hixNumber = :hixNumber,
    person.fixNumber = :fixNumber 
where exists (
      select personSub.id 
      from Person personSub
        inner join personSub.role r 
      where person.id = personSub.id 
          and r.type = 'ADMIN'"
    )

这可能就是问题所在:
where person.role.type='ADMIN'

这里的
person
是一个实体,而
role
是另一个实体。当您将
where
子句应用于实体关系的字段时,这意味着您要求JPA在
person
role
之间执行联接。问题是您不能在更新JPA查询中使用
join

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

要绕过该限制,您应该使用一个子查询,该子查询不是联接,而是此上下文中的有效替代项。例如:

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

人与角色的关系是什么?它是如何诠释的?也向我们展示人形embeddable@MaciejKowalski还添加了personId