我正在尝试提出一个מ更新查询,我可以在我的所有应用程序中使用它来更新表(库存)。这是我到目前为止所做的:
public void updateInventory(Inventory inventory){
PreparedStatement ps=null;
try {
String query =
"UPDATE "+TableName.INVENTORY +" "+
"SET quantity=IFNULL(?, quantity), full_stock=IFNULL(?, full_stock), reorder_level=IFNULL(?, reorder_level), selling_price=IFNULL(?, selling_price), delete_status=IFNULL(?, delete_status), product_id=IFNULL(?, product_id) "+
"WHERE id = ? OR product_id=IFNULL(?, product_id) ";
connection = hikariDS.getConnection();
ps = connection.prepareStatement(query);
ps.setFloat(1,inventory.getQuantity());
ps.setFloat(2,inventory.getFullStock());
ps.setFloat(3,inventory.getReorderLevel());
ps.setFloat(4,inventory.getPrice());
ps.setInt(5, inventory.getDeleteStatus());
ps.setInt(6, inventory.getProdId());
ps.setInt(7, inventory.getId());
ps.setInt(8, inventory.getProdId());
ps.executeUpdate();
} catch(SQLException e){ e.printStackTrace();}
finally{
if( connection != null ){
try {connection.close();}
catch (SQLException ex) {logger.log(Level.SEVERE, null, ex);}
}
if( ps != null){
try { ps.close();}
catch (SQLException ex) { logger.log(Level.SEVERE, null, ex);}
}
}
}
上面的查询应该只在设置了对象时用对象中的新值更新列,但如果没有设置,只需用列中的现有值来提供它。
问题是:如果从Inventory对象检索的值为null或0值,则不会使用现有值进行更新。
答案 0 :(得分:1)
您没有任何实际将值设置为所提供参数的内容。
SET quantity=IFNULL(?, quantity), full_stock=IFNULL(?, full_stock), reorder_level=IFNULL(?, reorder_level), selling_price=IFNULL(?, selling_price), delete_status=IFNULL(?, delete_status), product_id=IFNULL(?, product_id) "+
"WHERE id = ? OR product_id=IFNULL(?, product_id)
应该是
SET quantity=IFNULL(?, quantity, ?), ...
等。这意味着您必须复制每个参数。
答案 1 :(得分:1)
我假设您的java端值(inventory
)可能为null,并且您希望为每个可能的值组合都有一段代码。
SQL看起来很好,但要获取IFNULL(NULL,...),假设你的getter返回一个Object包装器,如:
Float getQuantity()
然后你需要打电话
ps.setObject(1, inventory.getQuantity());
顺便说一句,java端的BigDecimal
和SQL架构端的DECIMAL
是更好的选择。对于浮点的舍入误差。这将启用:
ps.setBigDecimal(1, inventory.getQuantity());
对于非null getter,使用IF():
SET quantity = IF(? = 0.0, quantity, ?),
ps.setDouble(1, inventory.getQuantity());
ps.setDouble(2, inventory.getQuantity());