2013-03-15 2 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 (например) будут иметь несколько разных дат. –

+0

На самом деле у него есть таблица пользователей, которая ссылается на сообщение, которое я хочу отображать, - это не только сообщение, но и пользователь. ahm игнорирует send_date. я снова отредактирую вопрос, чтобы отобразить ERD – Farnsbert

+0

См. изменение в моем ответе. –

ответ

3

Этот запрос не имеет смысла. group by используется, когда предложение select содержит хотя бы одну функцию агрегации (сумма, avg, min, max и т. Д.). И все остальные столбцы должны появиться в предложении group by.

Так, например, следующий запрос будет иметь смысл:

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

Он вернется, для каждого отправителя сообщения, длина его длинного сообщения.

Сообщите нам, с примерными данными, к какому возврату запрос будет возвращен.

Если вы хотите, чтобы получить все отдельные пользователи, которых пользователь А послал сообщение, запрос должен быть просто

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

ok я отредактирую свой вопрос – Farnsbert

+0

Спасибо за ответ. Да, это будет логически работать, но я получаю сообщение об ошибке Класс 'biz.dtit.golf.entities.User' не имеет свойства sendTo. Это потому, что я думаю, что я больше не могу получить ссылочное значение из таблицы пользователя ... Я думал о том, чтобы вручную удалить дубликаты, используя это ... Map map = new HashMap (); (Сообщение беспорядок: сообщение) { if (! Map.containsKey (mess.getSendTo(). GetUserId())) { map.put (mess.getSendTo(). GetUserId(), mess); } } – Farnsbert

+0

Tha above query возвращает экземпляры пользователя. Не экземпляры сообщений. Разве вы этого не хотите? –

Смежные вопросы