简体   繁体   English

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

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

When trying to access Masterkey object from dba jpa repository throws a number format exception.尝试从 dba jpa 存储库访问 Masterkey 对象时,会引发数字格式异常。 Table has varchar column for masterkey field and string for an entity class.表具有用于主键字段的 varchar 列和用于实体类的字符串。 Please find below the details.请在下面找到详细信息。

Entity Class实体类

@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;
  }
}

Table Query表查询

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

Repository Class存储库类

public interface MasterKeyRepository extends CrudRepository<MasterKey,Long> {

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

Insert This Query插入此查询

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

Throws Exception When Calling调用时抛出异常

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

Properties特性

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

Versions :版本:

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 

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

Natural IDs are immutable by default and you should not provide setter methods for them.默认情况下,自然 ID 是不可变的,您不应为它们提供 setter 方法。 If you need mutable, natural identifier, you have to set the mutable attribute of the @NaturalId annotation to true.如果需要可变的自然标识符,则必须将@NaturalId 注解的可变属性设置为true。

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

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