2015-05-19 38 views
3

元素我已經寫了一個方法存根凡在我在的PreparedStatement這個SQL缺乳至今:SQL查詢來加入ArrayList中

PreparedStatement ps = connection.prepareStatement("SELECT id,itemId,userId, sum(I.price) as totalAmount FROM dbo.Orders o 
join dbo.Items I on o.itemId = I.id join dbo.Users u on o.UserId = u.Id where o.id = ?"); 
      ps.setInt(1, id); 

要求: 檢索給定的訂單ID項目的不同值並將它們添加到arrayList。

這裏是我的方法看起來像至今:

public ArrayList<Orders> GetOrders(Connection connection) throws Exception 
      { 
       ArrayList<Orders> feedData = new ArrayList<Orders>(); 
      ArrayList<Integer> itemsId = new ArrayList<Integer>(); 
//How do I get items in this arraylist since there could be multiple items for a given order ? 
      try 
     { 
      PreparedStatement ps = connection.prepareStatement("SELECT id,itemId, userId, sum(I.price) as totalAmount FROM dbo.Orders o join dbo.Items I on o.itemId = I.id join dbo.Users u on o.UserId = u.Id where o.id = ? group by o.id"); 
      ps.setInt(1, id); 
      ResultSet rs = ps.executeQuery(); 
      while(rs.next()) 
      { 
       Orders o = new Orders(); 
       o.setId(rs.getInt("id")); 
      //how do I add elements itemid's in itemsId array list here.? 
       while(){ 

       } 
       o.setItem(itemsId); 
       o.setUserId(rs.getInt("price")); 
       o.setTotalAmount(rs.getInt("totalAmount")); 
       feedData.add(o); 
      } 
      return feedData; 
     } 
     catch(Exception e) 
     { 
      throw e; 
     } 
    } 

編輯:

數據庫模式:

create table Users 
(
Id int not null primary Key identity(1,1) constraint fk_UserId_Id references Orders(UserId), 
name nvarchar(50), 
phone nvarchar(10) 
); 

create table Items 
(
Id int not null primary Key identity(1,1) constraint fk_item_Id references Orders(ItemId), 
name nvarchar(50), 
Price int 
); 

create table Orders 
(
id int not null primary Key identity(1,1), 
ItemId int, 
UserId int, 
); 
+1

我們可以有你的數據結構(數據庫模式)嗎? – Amadan

+0

@Amadan:好的,更新。 –

+0

你沒有更新這個問題,你遇到了完全不同的問題。 「爲給定訂單(即給定OrderId的所有項目的價格總和)推導total_price」和「檢索給定訂單Id的不同項目的值並將它們添加到arrayList」。甚至不相似。 – Amadan

回答

0

//這是你在找什麼?

PreparedStatement ps = connection.prepareStatement(" 
SELECT o.id,o.itemId,userId, sum(I.price) as totalAmount 
FROM dbo.Orders o 
INNER JOIN dbo.Items I on o.itemId = I.id 
INNER JOIN dbo.Users u on o.UserId = u.Id 
WHERE o.id = ? 
GROUP BY o.id,o.itemId,u.userId"); 
ps.setInt(1, id); 
+0

不,我需要爲給定orderId的items列子列表創建一個arraylist –

0

基本上你需要遍歷返回的所有記錄,即使你只想加載1個訂單對象。

這是我做的一個快速模擬,所以不要批評批評,是的,它可以更好地實施。

public ArrayList<Orders> GetOrders(Connection connection) throws Exception { 
    ArrayList<Orders> feedData = new ArrayList<Orders>(); 
    int id = 0; // your Order ID 
    try { 
     PreparedStatement ps = connection.prepareStatement("SELECT id,itemId, userId, sum(I.price) as totalAmount FROM dbo.Orders o join dbo.Items I on o.itemId = I.id join dbo.Users u on o.UserId = u.Id where o.id = ? group by o.id"); 
     ps.setInt(1, id); 
     ResultSet rs = ps.executeQuery(); 

     ArrayList<Integer> itemsId = new ArrayList<Integer>(); 
     Orders o = new Orders(); 
     boolean populateOrder = true; 

     while(rs.next()) { 

      itemsId.add(rs.getInt("itemId")); 

      if(populateOrder) { 
       o.setId(rs.getInt("id")); 
       o.setUserId(rs.getInt("price")); 
       o.setTotalAmount(rs.getInt("totalAmount")); 
       feedData.add(o); 
       populateOrder = false; // make sure this If executes only once 
      } 
     } 
     o.setItem(itemsId); 

     return feedData; 
    } catch(Exception e) { 
     throw e; 
    } 
} 

上面的例子有一個很大的侷限性,那就是它只適用於單個訂單(一個訂單ID)。如果您希望加載代碼需要更改的多個訂單。