簡體   English   中英

在Spring數據JPA CrudRepository定義無效的自定義更新查詢

[英]Invalid custom update query defined in Spring Data JPA CrudRepository

我在無法正常工作的Spring CrudRepository中有一個自定義JPQL查詢。

這是我的實體類,PK類和實體的CrudRepository接口:

@Entity(name = "TBL_PRINCIPAL_CREDENTIAL")
public class PrincipalCredential {

    @EmbeddedId
    private PrincipalCredentialPK principalCredentialPK;

    // ...getter & setter for principalCredentialPK
}

@Embeddable
public class PrincipalCredentialPK implements Serializable {

    @Column(name = "PRINCIPAL_TYPE_ID", nullable = false)
    private String principalTypeID;

    @Column(name = "PRINCIPAL_ID", nullable = false)
    private String principalID;

    @Column(name = "CREDENTIAL_ID", nullable = false)
    private Integer credentialID;

    @Column(name = "CREDENTIAL_TYPE_ID", nullable = false)
    private String credentialTypeID;

    // ...getters & setters for all fields...
}

@Transactional
public interface PrincipalCredentialRepository extends CrudRepository<PrincipalCredential, PrincipalCredentialPK> {

    @Modifying
    @Query("update PrincipalCredential pc set pc.principalCredentialPK.principalID =:newPrincipalID " +
            "where pc.principalCredentialPK.principalID =:oldPrincipalID and pc.principalCredentialPK.principalTypeID =:principalType")
    void updatePrincipalID(@Param("oldPrincipalID") String oldPrincipalID, @Param("newPrincipalID") String newPrincipalID,
                           @Param("principalType") String principalType);
}

當我使用SpringBoot啟動項目時,無法實例化存儲庫bean,並且出現以下異常:

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'principalCredentialRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Validation failed for query for method public abstract void com.consorsbank.services.banking.caas.repositories.PrincipalCredentialRepository.updatePrincipalID(java.lang.String,java.lang.String,java.lang.String)!

Caused by: java.lang.IllegalArgumentException: Validation failed for query for method public abstract void com.consorsbank.services.banking.caas.repositories.PrincipalCredentialRepository.updatePrincipalID(java.lang.String,java.lang.String,java.lang.String)!

Caused by: java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: PrincipalCredential is not mapped [update PrincipalCredential pc set pc.principalCredentialPK.principalID =:newPrincipalID where pc.principalCredentialPK.principalID =:oldPrincipalID and pc.principalCredentialPK.principalTypeID =:principalType]

同樣對於另一個存儲庫,此查詢也有效,不同之處在於另一個實體的PK更簡單,並且在此處提供了兩個ID。

@Entity
@Table(name = "TBL_PRINCIPALS")
public class Principal implements Serializable {

    @EmbeddedId
    private PrincipalPK principalPK;

    @OneToOne
    @JoinColumn(name = "PRINCIPAL_TYPE_ID", insertable = false, updatable = false)
    private PrincipalType principalType;

    @Column(name = "USER_ID")
    private Integer userID;

    @Column(name = "VALID_UNTIL")
    private Date validUntil;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "ZAAS_TBL_PRINCIPAL_CREDENTIAL",
            joinColumns = {@JoinColumn(name = "PRINCIPAL_ID"), @JoinColumn(name = "PRINCIPAL_TYPE_ID")},
            inverseJoinColumns = {@JoinColumn(name = "CREDENTIAL_ID"), @JoinColumn(name="CREDENTIAL_TYPE_ID")})
    public Set<Credential> credentials;

    // ...getters and setters...
}

@Embeddable
public class PrincipalPK implements Serializable {

    @Column(name = "PRINCIPAL_TYPE_ID", nullable = false)
    private String principalTypeID;

    @Column(name = "PRINCIPAL_ID", nullable = false)
    private String principalID;

    // ...getters and setters
}

@Transactional
public interface PrincipalsRepository extends CrudRepository<Principal, PrincipalPK> {

    @Modifying
    @Query("update Principal p set p.principalPK.principalID =:newPrincipalID " +
            "where p.principalPK.principalID =:oldPrincipalID and p.principalPK.principalTypeID =:principalType")
    void updatePrincipalID(@Param("oldPrincipalID") String oldPrincipalID, @Param("newPrincipalID") String newPrincipalID,
                           @Param("principalType") String principalType);
}

所以上面的查詢正在工作...有人可以指出PrincipalCredentialRepository中定義的查詢缺少的內容嗎?

實體定義似乎是錯誤的。 使用以下注釋

@Entity
@Table(name = "TBL_PRINCIPAL_CREDENTIAL")
public class PrincipalCredential {
//...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM