繁体   English   中英

如何修复 Spring 数据 JPA 尝试在没有 @Query 的情况下将 String 转换为 Decimal

[英]How to fix Spring data JPA try convert String to Decimal without @Query

尝试从 dba jpa 存储库访问 Masterkey 对象时,会引发数字格式异常。 表具有用于主键字段的 varchar 列和用于实体类的字符串。 请在下面找到详细信息。

实体类

@Entity
@Table(name = "JP_MasterKey")
public class MasterKey {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "masterId")
  private Long id;
  @Column(name = "keyStr")
  private String keyStr;
  @Column(name = "masterkeyStr")
  @NaturalId
  private String masterKeyString;
  @Column(name = "isbn")
  private String isbn;

  @ManyToOne
  @JoinColumns({@JoinColumn(name = "isbn", insertable = false, updatable = false), @JoinColumn(name = "masterkeyStr", insertable = false, updatable = false)})
  private AdoptionIsbnMap adoptionIsbnMap;

  @ManyToOne
  @JoinColumn(name = "isbn", insertable = false, updatable = false)
  private Title title;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getKeyStr() {
    return keyStr;
  }

  public void setKeyStr(String keyStr) {
    this.keyStr = keyStr;
  }

  public String getMasterKeyString() {
    return masterKeyString;
  }

  public void setMasterKeyString(String masterKeyStr) {
    this.masterKeyString = masterKeyStr;
  }

  public String getIsbn() {
    return isbn;
  }

  public void setIsbn(String isbn) {
    this.isbn = isbn;
  }

  public AdoptionIsbnMap getAdoptionIsbnMap() {
    return adoptionIsbnMap;
  }

  public void setAdoptionIsbnMap(
      AdoptionIsbnMap adoptionisbnmap) {
    this.adoptionIsbnMap = adoptionisbnmap;
  }

  public Title getTitle() {
    return title;
  }

  public void setTitle(Title title) {
    this.title = title;
  }
}

表查询

CREATE TABLE `jp_masterkey` (
  `masterId` bigint(20) NOT NULL AUTO_INCREMENT,
  `masterkeyStr` varchar(20) NOT NULL,
  `isbn` varchar(10) DEFAULT NULL,
  `keyStr` varchar(20) NOT NULL,
  PRIMARY KEY (`masterId`),
  UNIQUE KEY `idx_mtkey_keystr` (`masterkeyStr`,`keyStr`),
  KEY `keyStr` (`keyStr`) USING BTREE,
  KEY `idx_jpmasterkeyisbn` (`isbn`),
  KEY `IDX_JP_MASTERKEY_MASTERKEYSTR` (`masterkeyStr`)
) ENGINE=InnoDB AUTO_INCREMENT=21176003 DEFAULT CHARSET=utf8

存储库类

public interface MasterKeyRepository extends CrudRepository<MasterKey,Long> {

  Optional<List<MasterKey>> findByMasterKeyString(String masterKeyString);
}

插入此查询

INSERT INTO `jacplus`.`jp_masterkey` (`masterkeyStr`, `isbn`, `keyStr`) VALUES ('JP3RKM9LAEVXP', '0730305902', 'F92GULEQZUC');

调用时抛出异常

masterKeyRepository
            .findByMasterKeyString("JP3RKM9LAEVXP")
            .get();
org.springframework.dao.InvalidDataAccessApiUsageException: For input string: "JP3RKM9LAEVXP"; nested exception is java.lang.NumberFormatException: For input string: "JP3RKM9LAEVXP"

特性

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect

spring.datasource.url =XXXXXXX?serverTimezone=UTC
spring.datasource.username=XXX
spring.datasource.password=XXXX
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

版本:

Spring Boot

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
MySql Driver

  <modelVersion>4.0.0</modelVersion>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.18</version>

org.springframework.dao.InvalidDataAccessApiUsageException: For input string: "JP3RKM9LAEVXP"; nested exception is java.lang.NumberFormatException: For input string: "JP3RKM9LAEVXP"

at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:374)
        at 

来自https://thoughts-on-java.org/naturalid-good-way-persist-natural-ids-hibernate/

默认情况下,自然 ID 是不可变的,您不应为它们提供 setter 方法。 如果需要可变的自然标识符,则必须将@NaturalId 注解的可变属性设置为true。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM