如何解决SQLException-Spring Boot中的数据转换错误

时间:2019-04-10 21:13:53

标签: spring-boot jpa

我有两个通过类名(1:n)连接的表。

域:产品(1)

域:HistoryPrice(n)

产品

@Entity
@Table
public class Product extends AbstractBaseDomain<Long> {

    @NotBlank
    @Size(min = 2, max = 50)
    @Column(name ="name", unique = true)
    private String name;

历史价格

@Entity
@Table(name = "historyPrice")
public class HistoryPrice extends AbstractBaseDomain<Long> {

    @NotNull
    @ManyToOne
    @JoinColumn(name ="product")
    private Product product;

这是我的存储库

@Repository
public interface HistoryPriceRepository extends JpaRepository<HistoryPrice, Long> {

    @Query(value = "SELECT h.product " +
            "FROM history_price h " +
            "INNER JOIN product p ON h.product = p.name " +
            "WHERE p.name = :name", nativeQuery = true)
    List<?> findProductByName(@Param("name") String name);
}

这是我的控制器

@PostMapping(value = "/historyPrice")
public String searchForProducts(Model model, @RequestParam String namePart) {
    List<?> productList = historyPriceService.findProductName(namePart);
    model.addAttribute(HISTORYPRICE_VIEW, productList);
    return HISTORYPRICE_VIEW;
}

这是我创建表的SQL输出:

2019-04-11 18:39:20 DEBUG org.hibernate.SQL - create table history_price (id bigint not null, version integer, price decimal(19,2) not null, valid_since timestamp not null, product bigint not null, primary key (id))

2019-04-11 18:39:20 DEBUG org.hibernate.SQL - create table product (id bigint not null, version integer, current_price decimal(19,2) not null, manufacturer varchar(50), name varchar(50), primary key (id))

这是我总是得到的缩短的错误:

Caused by: org.hibernate.exception.DataException: could not extract ResultSet

Caused by: org.h2.jdbc.JdbcSQLException: Datenumwandlungsfehler beim Umwandeln von "HAMMER"
Data conversion error converting "HAMMER"; SQL statement:
SELECT h.product FROM history_price h INNER JOIN product p ON h.product = p.name WHERE p.name = ? [22018-197]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:357)
    at org.h2.message.DbException.get(DbException.java:168)

Caused by: java.lang.NumberFormatException: For input string: "HAMMER"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

我不知道我的问题是在我的存储库中还是其他地方。

也许有人可以给我一个正确的解决方案或一个很好的提示。

非常感谢您。

3 个答案:

答案 0 :(得分:1)

您的堆栈跟踪指示的问题是您的联接。您尝试将h.product(内部是产品对象的ID)连接到内部的字符串h.product.name。之后,Spring尝试将字符串解析为数字,从而导致NumberFormatException。

我假设您要获取HistoryPrice对象。因此,您的存储库中有三个选项:

  1. 像现在一样使用本机查询,但是修复表名并联接,我认为这可以工作:
"SELECT h.* " +
"FROM historyPrice h " +
"INNER JOIN product p ON h.product = p.id " +
"WHERE p.name = :name"
  1. 使用JPQL查询:
"SELECT h " +
"FROM historyPrice h " +
"INNER JOIN product p " +
"WHERE p.name = :name"
  1. 使用方法名称让spring数据生成您的查询:
List<HistoryPrice> findAllByProductName(String name);

答案 1 :(得分:0)

似乎在本机查询中,您试图将产品对象与字符串名称等同。

@Query(value = "SELECT h.product " +
            "FROM history_price h " +
            "INNER JOIN product p ON h.product.name = p.name " +
            "WHERE p.name = :name", nativeQuery = true)
    List<?> findProductByName(@Param("name") String name);

如果产品实体包含名称变量,则可能会执行上述查询。

答案 2 :(得分:-1)

你有纸叠吗? 您可以复制错误吗?

在您的日志堆栈中,您应该看到一些由标签引起的标签,这将为您提供引发异常的位置