2013-03-15 90 views
1

我的問題是爲什麼GROUP BY沒有顯示玻璃魚的日誌。 我在下面,因爲有人想看到它集團在JPA

public List<Message> listAllMessageBySender(String currentUserID) { 
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceUnit"); 
    EntityManager entityManager = emf.createEntityManager(); 

    TypedQuery<Message> eq = entityManager.createQuery("SELECT m FROM Message m WHERE m.sendBy.userId = :userid GROUP BY m.sendTo.userId", Message.class); 
    eq.setParameter("userid", Integer.parseInt(currentUserID)); 
    List<Message> message = eq.getResultList(); 
    return message; 
} 

Glassfish的3.1.2.Logs

FINE: SELECT id, message, send_date, send_by, send_to FROM message WHERE (send_by = ?) 
    bind => [50] 


Data: 
User A : sendBy.userId = 50 
User B : sendTo.userId = 44 
User C : sendTo.userId = 43 

id  send_date    send_by  send_to   message 

1 2013-03-14 14:58:46   44   50    50 send message to 44 
2 2013-03-14 14:58:46   50   44    reply from 44 to 50 
3 2013-03-14 17:38:52   44   50    2nd reply to 50 
6 2013-03-14 18:22:10   50   44    44 reply to 50 
7 2013-03-14 18:22:10   50   43    new 

in the query above is i want to list all the user sent from User A. it causes duplication because there is two send_to 44. the xhtml below shows : 

<ui:repeat value="#{messageController.items}" var="messageItem"> 
    <br /> 
    <div onclick="loadMessage()"> 
    <h:panelGroup layout="block" > 
     <p:graphicImage height="50" width="50" value="#{messageItem.sendTo.profilePicture}"/> 
    </h:panelGroup> 

    <h:panelGroup layout="block" style="width: 270px;">           
    <h:outputText value="#{messageItem.sendTo.registerName}"/> 
    <h:panelGroup layout="block" style="float:right;"> 
     <h:outputText value="#{messageItem.sendDate}" > 
     <f:convertDateTime pattern="HH:mm"/> 
     </h:outputText> 
    </h:panelGroup> 
    </h:panelGroup> 

    </div> 
    <p:remoteCommand name="loadMessageBean" action="#{messageController.loadMessage(messageItem.id)}" /> </ui:repeat>  


ERD 

User Table      Message Table 

user_id       message_id 
register_name      send_date 
            send_to  ----> referenced by user_id User Table 
            send_by  ----> referenced by user_id User Table 
+0

很抱歉,但目前還不清楚。如果要列出由用戶50發送的所有消息,並且用戶50已經向用戶44發送了兩條消息,則顯然這兩條消息應該由查詢檢索。如果你想獲得用戶50發送消息的所有不同用戶,那麼這是可能的,但是打印消息日期是沒有意義的,因爲顯然,從用戶50到用戶44(例如)的消息將具有幾個不同的日期。 – 2013-03-15 09:11:36

+0

實際上它有一個鏈接到消息的用戶表,我想要顯示的不僅僅是消息,還包括用戶。現在,ahm忽略send_date。我將再次編輯問題以顯示ERD – Farnsbert 2013-03-15 09:18:42

+0

請參閱編輯我的答案。 – 2013-03-15 10:13:13

回答

3

此請求沒有意義了以下數據。當select子句至少包含一個聚合函數(sum,avg,min,max等)時使用group by。而所有其他列必須出現在group by子句中。

因此,例如,下面的查詢纔有意義:

SELECT max(m.length), sender.userId from Message m 
inner join m.sendBy sender 
GROUP BY sender.userId 

它會返回,每個消息發送者,其最長消息的長度。

用示例數據告訴我們,你希望你的查詢返回什麼。

如果你想獲得所有的人用戶A發送消息給不同用戶,查詢應該簡單地

select distinct m.sendTo from Message m 
where m.sendBy.userId = :userid 
+0

好的我會編輯我的問題 – Farnsbert 2013-03-15 08:36:31

+0

感謝您的回答。是的,它將在邏輯上工作,但我得到一個錯誤 類'biz.dtit.golf.entities.User'沒有屬性'sendTo'。 這是因爲我認爲我不能再從用戶表中獲取參考值... 我正在考慮通過使用此手動刪除重複項... Map map = new HashMap (); (!mess.getSendTo()。getUserId(),mess);()。 } } – Farnsbert 2013-03-15 11:12:38

+0

上面的查詢返回用戶實例。不是消息實例。這不是你想要的嗎? – 2013-03-15 11:15:39