我需要在JTable的行中插入不同的结果。我使用buyID作为pID搜索我的记录,它将找到该特定purchaseID的2个结果。问题是当我将其插入行时,它只是复制第一个的结果。 EG:P0001有2个购买细节,当我将其插入行时,我有2个相同的行。我有什么方法可以逐个插入行吗?
PS。我从早上开始编码,大脑功能不佳。
UI:
else if(e.getSource() == jbtRetrieve)
{
String pID = jTF3.getText();
Purchase purchase = purcControl.selectRecord(pID);
if (purchase != null) {
String pdCountStr = purchase.getPurchaseDetailsID();
String pdCountStr2 = pdCountStr.substring(2,5);
int pdCount = Integer.parseInt(pdCountStr2);
for(int g = 0; g<pdCount;g++){ //g =1
tableModel.addRow(new Object[]{ purchase.getPurchaseDetailsID(),purchase.getStockID(),purchase.getPrice(),purchase.getQuantity()});
}}
DA:
public Purchase getRecord(String pID){
String queryStr = "SELECT PD.PURCHASEDETAILID,PD.PURCHASEID,PD.STOCKID,PD.ORDERQTY,S.STOCKPRICE FROM "+tableName+" PD, STOCKS S WHERE PD.STOCKID = S.STOCKID AND PurchaseID = ?";
Purchase purchase = null;
System.out.println("asd");
try{
stmt = conn.prepareStatement(queryStr);
stmt.setString(1,pID);
ResultSet rs = stmt.executeQuery();
if(rs.next()){
purchase = new Purchase(pID, rs.getString("purchaseID"),rs.getString("stockID"),rs.getDouble("stockprice"),rs.getInt("orderqty"));
}
}
catch (SQLException ex){
JOptionPane.showMessageDialog(null,ex.getMessage(),"ERROR",JOptionPane.ERROR_MESSAGE);
}
return purchase;
}
域:
public Purchase(String purchaseDetailsID,String purchaseID,String stockID,double price,int quantity)
{
this.purchaseDetailsID = purchaseDetailsID;
this.purchaseID = purchaseID;
this.stockID = stockID;
this.price = price;
this.quantity = quantity;
}
public void setPurchaseID(String u){
this.purchaseID = u;
}
public String getPurchaseID(){
return purchaseID;
}
public String getPurchaseDetailsID(){
return purchaseDetailsID ;
}
public double getPrice(){
return price;
}
public String getStockID(){
return stockID;
}
public int getQuantity(){
return quantity;
}
public void setPurchaseDetailsID(String r){
this.purchaseDetailsID = r ;
}
public void setPrice(double p){
this.price = p;
}
public void setStockID(String s){
this.stockID = s;
}
public void setQuantity(int q){
this.quantity = q;
}
控制:
public Purchase selectRecord(String pID){
return purcDA.getRecord(pID);
}
编辑:将购买设置为ArrayList&lt;&gt;接受列表,我得到这个例外。
Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:635) at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at ui.MainPurchasingFrame$ListenerClass.actionPerformed(MainPurchasingFrame.java:183)
代码:
ArrayList<Purchase> purchase = purcControl.selectRecord(pID);
if (purchase != null) {
String pdCountStr = purchase.get(0).getPurchaseDetailsID();
String pdCountStr2 = pdCountStr.substring(2,5);
int pdCount = Integer.parseInt(pdCountStr2);
System.out.print(pdCount);
for(int g = 0; g<pdCount;g++){
tableModel.addRow(new Object[]{ purchase.get(g).getPurchaseDetailsID(),purchase.get(g).getStockID(),purchase.get(g).getPrice(),purchase.get(g).getQuantity()}); //This is where the exception occurs.
}
答案 0 :(得分:2)
如果要从查询中返回多个对象,则返回类型应为数组或该类型的集合。
所以不要定义
public Purchase getRecord(String pID){…}
您应该将DA方法定义为:
public List<Purchase> getRecords(String pID) {…}
在方法内部,定义一个列表对象,例如:
List<Purchase> foundPurchases = new ArrayList<>();
然后在发出查询并获取结果集之后,使用while循环来填充它:
while ( rs.next() ) {
purchase = new Purchase(pID, rs.getString("purchaseID"),rs.getString("stockID"),rs.getDouble("stockprice"),rs.getInt("orderqty"));
foundPurchases.add( purchase );
}
然后,在完成并关闭语句后,您应该返回foundPurchases:
return foundPurchases;
当然,调用代码应该会收到List
次购买而不是购买,然后迭代并显示它。
现在关于你编辑的部分。你正在做不正确的事情。
首先,您不必进入购买记录以查看有多少记录。如果没有,则列表将为空。如果有1,它的大小将是1,如果有2,它的大小将是2。
其次,你实际上不需要知道有多少元素,因为你可以在一个简单的for循环中使用它的迭代器来遍历一个列表:
ArrayList<Purchase> purchaseList = purcControl.selectRecord(pID);
for ( Purchase purchase : purchaseList ) {
…
}
您实际上不必使用get
。您在变量purchase
中有当前的个人购买(请注意,我将原始变量的名称更改为显示列表而非购买的内容),您可以直接使用它。
另请注意,您无需检查空值。我编写它的方式,DA方法总是返回对List的引用,即使它是一个空列表。并且循环总是向列表添加实际new Purchase(…)
,因此列表的项也永远不会为空。
但有一件事:从错误看起来的方式来看,当细节ID表示应该有两行时,似乎只有一行。直接用数据库检查您的查询,以确保实际上有两个记录。
如果要在未找到任何内容时显示错误,则应使用if
语句检查列表是否为空。这意味着根本没有返回任何记录。
if ( purchasedList.isEmpty() ) {
// Display error dialog
} else {
// Do the for loop to fill the rows
}