Усечение данных для enum в Java и MySQL (java.sql.SQLException: Данные, усеченные для ...) - PullRequest
0 голосов
/ 18 марта 2019

У меня есть собственный класс, который представляет файловую структуру .csv, которая позже считывается в arrayList этого класса.Он имеет следующие теги:

public class InputFile {

public enum Status {
    IN_STOCK,
    OUT_OF_STOCK
}

private int lineNumber;
private String sku;
private Status statusCode;
private Date orderDate;

public InputFile(int lineNumber, String sku, Status status, Date orderDate) {
    this.lineNumber = lineNumber;
    this.sku = sku;
    statusCode = status;
    setOrderDate(orderDate);
}

public Status getStatusCode() {
    return statusCode;
}

public void setStatusCode(Status input) {
    statusCode = input;
}

Вот упрощенный файл .csv:

LineNumber;SKU;Status;OrderDate
1;553555254;IN_STOCK;2018-04-21
2;668470653;IN_STOCK;2018-05-08
3;899395925;OUT_OF_STOCK;2018-06-06

Когда я читаю их в arrayList и помещаю отдельные состояния в консоль для проверки,он показывает правильно (IN_STOCK, OUT_OF_STOCK).Однако, когда я пытаюсь вставить его в базу данных, он усекается:

java.sql.SQLException: данные усекаются для столбца 'Status' в строке 1

Здесьэто код для загрузки базы данных:

try {
     String orderItemQuery = "INSERT INTO `order_processing`.`order_item` (`OrderItemId`, `OrderId`, `SalePrice`, `ShippingPrice`, `Sku`, `Status`)" + "VALUES (?, ?, ?, ?, ?, ?)";

     PreparedStatement orderItemStmt = conn.prepareStatement(orderItemQuery);
     for (InputFile i : CSVManager.getList())
     {
         orderItemStmt.setInt (1, i.getOrderItemId());
         orderItemStmt.setInt(2,i.getOrderId());
         orderItemStmt.setDouble (3, i.getSalePrice());
         orderItemStmt.setDouble (4, i.getShippingPrice());
         orderItemStmt.setString (5, i.getSku());
         orderItemStmt.setObject(6, InputFile.Status.valueOf(i.getStatusCode().toString()));
         orderItemStmt.execute();
        }
    }
    catch (Exception e)
    {
        ...
    }

А вот .sql для таблицы базы данных:

create table order_item
(
  OrderItemId    int         not null
    primary key,
  OrderId        int         not null,
  SalePrice      decimal     not null,
  ShippingPrice  decimal     not null,
  TotalItemPrice decimal AS (ShippingPrice + SalePrice) not null,
  SKU            varchar(25) not null,
  Status         enum ('OUT_OF_STOCK', 'IN_STOCK') not null,
  constraint order_item_order_OrderId_fk
    foreign key (OrderId) references `order` (OrderId)
);

Чего не хватает?Почему перечисление усекается?

РЕДАКТИРОВАТЬ: Проблема заключалась в том, что типы перечисления Java имеют другие порядковые номера, чем MYSQL.Java начинает отсчет с 0, а MYSQL - с 1. Чтобы устранить разницу, в моих перечислениях необходимо внести изменения в порядковый список:

    public enum Status {
    OUT_OF_STOCK (1),
    IN_STOCK (2);

    private int status;

    private Status (final int status) {
        this.status = status;
    }

    public int getStatus() {
        return status;
    }
}

Затем образец вставки данных в базу данных:

orderItemStmt.setInt(6, i.getStatusCode().getStatus());

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Я считаю, что тип перечисления в SQL хранится как число. Его размер составляет 1 или 2 байта. Если вы хотите сохранить текстовую версию поля состояния, объявите столбец как varchar. Или вы должны хранить порядковый номер статуса.

0 голосов
/ 18 марта 2019

Используйте Status.valueOf ("IN_STOCK") и IN_STOCK.name () при сохранении ваших данных в базе данных.

...