2013-03-15 42 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