2016-01-06 18 views
1

你好,我是HQL新手,我堅持在HQL中查詢。問題在HQL中使用求和方法的不合適結果

結構我有兩個類項目和一個(項目)的收入處於休眠很多(收入)的關係。

有一個特定項目的收入是如此之多。

我想幹什麼?

我想檢索所有項目,每個項目都帶有所有收入的總和。 假設有兩個項目有3000個(項目一的各種不同收入的總和)和4000個(項目二的各種不同收入的總和)總收入量,我想將它們作爲一個對象列表檢索。這個對象列表應該包含項目1和2以及它們各自的總金額。

我在做什麼

public java.util.List<Object[]> retrieveFromTo(int firstResult, int maxResult) { 
    session = sessionFactory.openSession(); 

    Query query = session.createQuery(
       "select p.projectId, " 
      + "p.projectDateOfCommencement, " 
      + "p.projectName, " 
      + "pi.investorName, " 
      + "sum(bc.incomeAmount), " 
      + "sum(ab.expenseAmount), " 
      + "sum(bc.incomeAmount)-sum(ab.expenseAmount), " 
      + "p.projectStatus, " 
      + "p.projectCompletitionDate " 
      + "from Project as p, Investor as i " 
         + "left outer join p.projectExpenses as ab " 
         + "left outer join p.projectIncome as bc " 
         + "left outer join p.projectInvestor as pi " 
         + "group by p.projectId, pi.investorId "       
         + "order by p.projectId desc ") 
      .setFirstResult(firstResult) 
      .setMaxResults(maxResult); 

    List<Object[]> projects = query.list(); 

    session.close(); 

    return projects;   
} 

結果查詢的是產不恰當的結果。

假設有兩個項目,如果兩個項目的總收入都假設爲3000,那麼這個查詢檢索項目總收入爲3000(正確)的項目列表,但第二個項目的總收入只是第一個意思是6000,而應該是3000。

請有人讓我知道,究竟我想要添加或刪除從我的查詢來獲得我想要的輸出。 在此先感謝!

+0

你能舉個例子嗎? –

+0

兩個階段的項目和收入,並有一個(項目)對他們之間的許多(收入)關係。我想檢索一個項目列表,其中每個項目應該包含所有收入的總和。我寫了以下給出的查詢,但它不能正常工作 – tinku

+1

會更有幫助,如果您添加到您的問題的一些示例與數據,執行查詢和結果 – Paizo

回答

1

從我從你的問題的理解,你似乎有這樣一對多的關係:

public class Project { 
    ... 

    @OneToMany 
    List<Expense> expenses; 

    @OneToMany 
    List<Income> incomes; 

    ... 
} 

讓我們假設你的數據庫結構是這樣的;

項目

id   name 
1   helloWorld 

project_income

proj_id  income_id 
1   1 

project_expense

proj_id  expense_id 
1   1 
1   2 

收入

id   amount 
1   200 

費用

id   amount 
1   500 
2   600 

你查詢產生這樣

proj_id  proj_name  income_id  income_amount  expense_id  expense_amount 
1   helloWorld  1    200     1    500 
1   helloWorld  1    200     2    600 

,所以當你總結incomeAmountexpenseAmount,你得到的結果是這樣的結果:

proj_id  proj_name  sum(income_amount)  sum(expense_amount) 
1   helloWorld  400      1100 

因此,當您總計incomeAmountexpenseAmount時,您(有時)會得到兩倍或三倍的值。它是加入語句的本質。你可能想看看什麼是內部和外部連接,以及它們是如何產生結果的。

爲了得到想要的結果,一個解決方案(許多可用的一個)是您可以使用多個SELECT語句如下所示:

Query query = session.createQuery(
      "select p.projectId, " 
     + "p.projectName, " 
     + "(select sum(i.incomeAmount) from Income i where i.incomeProject = p), " 
     + "(select sum(e.expenseAmount) from Expense e where e.expenseProject = p), " 
     + "from Project as p" 
        + "group by p.projectId, pi.investorId ") 
     .setFirstResult(firstResult) 
     .setMaxResults(maxResult); 

輸出:

proj_id  proj_name  sum(income_amount)  sum(expense_amount) 
1   helloWorld  200      1100 

我希望能幫助到你。

+1

感謝rdx它的工作原理!非常感謝 – tinku