dbutils库中的BeanListHandler无法从数据库结果集中创建Java类对象

geo*_*dex 2 java derby resultset javabeans apache-commons-dbutils

我在apache derby数据库中创建了一个名为Product的类和一个具有相同名称(Product)的表。现在,无论何时我使用BeanListHandler从数据库中检索行时,我都希望获得相应的Product对象,但总是会得到一个错误。我几乎到处都在搜索解决方案,之后我仍然看不到我的代码出了什么问题。有人可以告诉我我哪里错了。我的代码如下所示。

public class Product {

private long uniqueId; //Auto increment
private String productCode;  
private String productName;
private String productCategory;
private boolean available;
private double productPrice;
private int quantityOnHand;    

public Product(long uniqueId, String productCode, String productName, String productCategory, boolean available, double productPrice, int quantityOnHand) {
    this.uniqueId = uniqueId;    //Auto increment
    this.productCode = productCode;
    this.productName = productName;
    this.productCategory = productCategory;
    this.available = available;
    this.productPrice = productPrice;
    this.quantityOnHand = quantityOnHand;    }

@Override
public String toString() {
    return "Product{" + "uniqueId=" + uniqueId + ", productCode=" + productCode + ", productName=" + productName + ", productCategory=" + productCategory + ", available=" + available + ", productPrice=" + productPrice + ", quantityOnHand=" + quantityOnHand + '}';
}


public long getUniqueId() {
    return uniqueId;
}

public String getProductCode() {
    return productCode;
}

public String getProductName() {
    return productName;
}

public String getProductCategory() {
    return productCategory;
}

public boolean isAvailable() {
    return available;
}

public double getProductPrice() {
    return productPrice;
}

public int getQuantityOnHand() {
    return quantityOnHand;
}


public void setUniqueId(long uniqueId) {
    this.uniqueId = uniqueId;
}

public void setProductCode(String productCode) {
    this.productCode = productCode;
}

public void setProductName(String productName) {
    this.productName = productName;
}

public void setProductCategory(String productCategory) {
    this.productCategory = productCategory;
}

public void setAvailable(boolean available) {
    this.available = available;
}

public void setProductPrice(double productPrice) {
    this.productPrice = productPrice;
}

public void setQuantityOnHand(int quantityOnHand) {
    this.quantityOnHand = quantityOnHand;
}

@Override
public int hashCode() {
    int hash = 5;
    hash = 53 * hash + (int) (this.uniqueId ^ (this.uniqueId >>> 32));
    hash = 53 * hash + Objects.hashCode(this.productCode);
    hash = 53 * hash + Objects.hashCode(this.productName);
    hash = 53 * hash + Objects.hashCode(this.productCategory);
    hash = 53 * hash + (this.available ? 1 : 0);
    hash = 53 * hash + (int) (Double.doubleToLongBits(this.productPrice) ^ (Double.doubleToLongBits(this.productPrice) >>> 32));
    hash = 53 * hash + this.quantityOnHand;
    return hash;
}

@Override

    }
    if (obj == null) {
        return false;
    }
    if (getClass() != obj.getClass()) {
        return false;
    }
    final Product other = (Product) obj;
    if (!Objects.equals(this.productCode, other.productCode)) {
        return false;
    }
    if (!Objects.equals(this.productName, other.productName)) {
        return false;
    }
    if (!Objects.equals(this.productCategory, other.productCategory)) {
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

}

下面是检索“产品”行并将其转换为“产品对象”的方法。我已经导入并创建了建立连接和执行查询所需的每个组件(例如,私有QueryRunner queryRunner = new QueryRunner();私有静态最终列表EMPTY_PRODUCT_LIST = new ArrayList <>();等等)

public List<Product> searchAllProducts() {
    ResultSetHandler<List<Product>> p = new BeanListHandler<>(Product.class);

    try{
   return   (List<Product>) queryRunner.query(connection, "SELECT * FROM PRODUCT", p);
        }
    catch(SQLException e){

              e.printStackTrace();
          }
     finally{
        try {
            DbUtils.close(connection);
        } catch (SQLException ex) {
            Logger.getLogger(ProductDatabaseHandler.class.getName()).log(Level.SEVERE, null, ex);
        }

        }
      return EMPTY_PRODUCT_LIST; }
Run Code Online (Sandbox Code Playgroud)

下面是我得到的错误。

Fri Dec 02 20:05:35 EAT 2016 : Apache Derby Network Server - 10.11.1.2 -     (1629631) started and ready to accept connections on port 1555
java.sql.SQLException: Cannot create main.java.models.Product:
main.java.models.Product Query: SELECT * FROM PRODUCT Parameters: []
at   org.apache.commons.dbutils.AbstractQueryRunner.rethrow(AbstractQueryRunner.java:392) 
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:351)
at org.apache.commons.dbutils.QueryRunner.query(QueryRunner.java:226)              
at main.java.database.ProductDatabaseHandler.searchAllProducts(ProductDatabaseHandler.java:226)
Run Code Online (Sandbox Code Playgroud)

Jus*_*ose 5

我认为您需要Product使用适当的setter方法为您的类提供无参数构造函数。

BeanProcessor负责转换Resultset为bean,下面是创建新bean实例的代码。

  protected <T> T newInstance(Class<T> c) throws SQLException {
    try {
        return c.newInstance();

    } catch (InstantiationException e) {
        throw new SQLException(
            "Cannot create " + c.getName() + ": " + e.getMessage());

    }
Run Code Online (Sandbox Code Playgroud)

显然,它期望一个无参数的构造函数