Search code examples
javajdbcenumsresultset

Having trouble reading String from MySQL table to Eclipse


I have a project of coupons but I have an issue when trying to read a coupon to Eclipse. I have a table of categories which are connected to my coupons table in row "CATEGORY_ID" which is an int. when using add Method I convert my ENUM to int in order to add it to CATEGORY_ID with no problem.

my issue is when trying to read it, I try and convert it to STRING to get a text value, however, I get an exception.

here is my code:

ENUM CLASS:

public enum Category {

FOOD(1), ELECTRICITY(2), RESTAURANT(3), VACATION(4), HOTEL(5);

private Category(final int cat) {
    this.cat = cat;
}

private int cat;

public int getIDX() {
    return cat;
}

private Category(String cat1) {
    this.cat1 = cat1;
}

private String cat1;

public String getName() {
    return cat1;
}
}

A Method to add coupon to table COUPONS:

// sql = "INSERT INTO `couponsystem`.`coupons` (`COMPANY_ID`,`CATEGORY_ID`,`TITLE`, `DESCRIPTION`, 
          `START_DATE`, `END_DATE`, `AMOUNT`, `PRICE`, `IMAGE`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?);";

@Override
    public void addCoupon(Coupon coupon) throws SQLException {
        Connection connection = pool.getConnection();

    try {
        PreparedStatement statement = connection.prepareStatement(ADD_COUPON);
        statement.setInt(1, coupon.getCompanyID());
        statement.setInt(2, coupon.getCategory().getIDX());
        statement.setString(3, coupon.getTitle());
        statement.setString(4, coupon.getDescription());
        statement.setDate(5, (Date) coupon.getStartDate());
        statement.setDate(6, (Date) coupon.getEndDate());
        statement.setInt(7, coupon.getAmount());
        statement.setDouble(8, coupon.getPrice());
        statement.setString(9, coupon.getImage());
        statement.execute();

    } finally {
        pool.restoreConnection(connection);
    }
}

Method to get coupon:

// GET_ONE_COUPON = "SELECT * FROM `couponsystem`.`coupons` WHERE (`id` = ?);";


@Override
    public Coupon getOneCoupon(int couponID) throws SQLException {
    Connection connection = pool.getConnection();

        Coupon result = null;
        
        List<Category> cats = new ArrayList<Category>(EnumSet.allOf(Category.class));
        

        try {

            PreparedStatement statement = connection.prepareStatement(GET_ONE_COUPON);
            statement.setInt(1, couponID);
            ResultSet resultSet = statement.executeQuery();
            resultSet.next();
            result = new Coupon(resultSet.getInt(1), resultSet.getInt(2), Category.valueOf(resultSet.getString(3)),
                    resultSet.getString(4), resultSet.getString(5), resultSet.getDate(6), resultSet.getDate(7),
                    resultSet.getInt(8), resultSet.getDouble(9), resultSet.getString(10));

        } finally {
            pool.restoreConnection(connection);
        }

        return result;

on column index (3) I try a and convert ENUM to string to get a text value, here is where I get an exception.

EXCEPTION:

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant coupon.beans.Category.5
    at java.base/java.lang.Enum.valueOf(Enum.java:240)
    at coupon.beans.Category.valueOf(Category.java:1)
    at coupon.dbdao.CouponsDBDAO.getOneCoupon(CouponsDBDAO.java:125)
    at coupon.Program.main(Program.java:65)

Hope I am clear with my question. I have no issue adding any more information.


Solution

  • valueOf expects a string that corresponds to the name of the enum element, like "FOOD" but it looks like you pass a number. If you want to pass the id (number) from your enum you need a method to translate between the number and the enum element. Something like this

    //in the enum Category
    public static Category categoryFor(int id) {
      switch (id) {
        case 1:
          return FOOD;
          case 2: 
          return ELECTRICITY;
          //... more case
          default:
          return HOTEL;
      }
    }
    

    and then call it like

    Category.categoryFor(resultSet.getInt(2))
    

    or you need to store the actual name of the element in your table.

    Also you shouldn't use *, "SELECT * ...", in your query but a list of column names so it is clear what column you map in your java code, "SELECT COMPANY_ID, CATEGORY_ID,TITLE,..."