Как решить SQLException - Ошибка преобразования данных в Spring Boot - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть две таблицы, которые связаны через имя класса (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;

HistoryPrice

@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 ]

1 голос
/ 11 апреля 2019

Проблема, указанная в вашей трассировке стека, - это ваше соединение. Вы пытаетесь присоединить h.product, который является внутренним идентификатором объекта продукта, к 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. Используйте имя метода, чтобы данные пружины генерировали ваши запросы:
List<HistoryPrice> findAllByProductName(String name);
0 голосов
/ 11 апреля 2019

Кажется, что в собственном запросе вы пытаетесь приравнять объект продукта со строковым именем.

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

Если объект Product содержит переменную name, то вышеупомянутый запрос может быть выполнен.

0 голосов
/ 11 апреля 2019

есть ли у вас стек?Можете ли вы скопировать ошибку?

В вашем стеке журнала вы должны увидеть некоторые из них, вызванные меткой, которая даст вам место, где выдается исключение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...