如何通过Spring数据JPA中的复合主键删除/搜索存在



场景

我有一个具有复合主键的实体,如下所示。还有一个具有使用tokeId复合密钥的existsdelete操作的存储库,如下所示。

@Entity
@IdClass(TokenId.class)
@NoArgsConstructor
@AllArgsConstructor
public class Token {
@Id
private String setId;
@Id
private String id;
@NotNull
private long expiration;
private boolean active;
private boolean setActive;
}
@Repository
public interface TokenRepositorySql extends JpaRepository<Token, TokenId> {
@Transactional
void deleteByIdIn(List<TokenId> id);
boolean existsByIdAndActiveTrueAndExpirationGreaterThan(TokenId tokenId, long currentTimestamp);

问题

在delete和exists函数中,hibernate都无法将Id映射为TokenId。相反,它需要一个Stringid。以下是例外。

Parameter value element [com.abc.security.token.repository.sql.entity.TokenId@458c58e3] did not match expected type [java.lang.String (n/a)]

解决方案

如果我在存储库中单独传递复合键的值,这似乎是有效的。但是我想要一种直接使用复合键的方法。

非常感谢您的帮助。

p.S.

我在SO.中也发现了这个没有答案的问题

干杯。

@Embeddable@EmbeddedId注释可以在此处实现此目的。

首先,您可以使用@Embeddable类级别的注释来注释TokenId类,如下所示:

@Embeddable
public class TokenId {
@Column(name="field1")
private String field1;
@Column(name="field2")
private String field2;
}

然后使用上面的Embeddable类作为父类中的embeddedId,如下所示:

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Token {
@EmbeddedId
private TokenId id;
@NotNull
private long expiration;
private boolean active;
private boolean setActive;
}

最新更新