从数据库中为不同用户排序消息

Sorting messages for different users from database

我正在使用 Hibernate 和 Postgres 开发 Spring-MVC 应用程序。在应用程序中,我正在添加聊天功能。我正在使用一个非常简单的数据库模式来保存聊天记录。在模式中,对于 table 消息,有 2 个外键,分别称为 table 用户作为发送者和接收者。 我目前能够发送和接收消息,但问题是我想将消息加入用户之间的对话中。我有时间戳来按时间对消息进行排序,但我不知道如何按其他用户(收件人姓名)对它们进行分组并在前端显示它们(HTML)

我正在发布一些代码和架构,请看一下:

SQL 代码:

CREATE TABLE public.userinfo (
                id INTEGER NOT NULL,
                email VARCHAR,
                username VARCHAR,
                displayname VARCHAR,
                password VARCHAR,
                CONSTRAINT id PRIMARY KEY (id)
);


CREATE TABLE public.conversation (
                conversation_id NUMERIC NOT NULL,
                messagetext VARCHAR,
                time DATE,
                id INTEGER NOT NULL,
                userinfo_id INTEGER NOT NULL,
                CONSTRAINT conversation_id PRIMARY KEY (conversation_id)
);



ALTER TABLE public.conversation ADD CONSTRAINT userinfo_conversation_fk
FOREIGN KEY (id)
REFERENCES public.userinfo (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE;

ALTER TABLE public.conversation ADD CONSTRAINT userinfo_conversation_fk1
FOREIGN KEY (userinfo_id)
REFERENCES public.userinfo (id)
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE;

MessagesDAOImple :

@Override
    public boolean addMessage(User sender, User receiver, Messages messages) {
        if( session == null) {
            session = this.sessionFactory.openSession();
        }else {
            session = this.sessionFactory.getCurrentSession();
        }
        int id = sender.getId();
        User sender1 = (User) session.get(User.class,id);
        sender.getMessages1().add(messages);
        receiver.getMessages2().add(messages);
        session.saveOrUpdate(messages);
        session.flush();
        return true;
    }

@Override
    public List<Messages> listMessagesForUser(User user) {
        if(session == null){
            session = this.sessionFactory.openSession();
        } else{
            session = this.sessionFactory.getCurrentSession();
        }
        int id = user.getId();
        Query query = session.createQuery("from Messages as m where m.user2.id=:id");
        query.setParameter("id",id);
        List<Messages> messagesList= query.list();
        return messagesList;

    }

我还在写 html 代码,所以我现在没有,但如果有可能使用像 c:forEach 这样简单的东西并将消息显示为列表我正在寻找按对话分组的测试。任何指示或建议都会很好。谢谢你。

我不确定你在找什么。

这是一些 SQL 到 return 两个用户 (123 & 321) 之间的对话

SELECT * FROM (
    SELECT * from conversation WHERE id = 123 and user_info_id = 321
    UNION 
    SELECT * from conversation WHERE id = 321 and user_info_id = 123
) conv ORDER BY time ASC

这是获取用户 123 和任何合作伙伴的所有对话的查询

SELECT * FROM (
    SELECT user_info_id AS partner_id, * from conversation WHERE id = 123
    UNION 
    SELECT id AS partner_id, * from conversation WHERE user_info_id = 123
) conv ORDER BY partner_id, time ASC

使用上述方法需要您遍历结果并决定通过 partner_id 显示不同的对话伙伴。

为避免循环,您可能需要考虑聚合函数,但我不确定此处 GROUP BY 子句的性能。

SELECT partner_id, array_agg(messagetext) FROM (
    SELECT * FROM (
        SELECT user_info_id AS partner_id, * from conversation WHERE id = 123
        UNION 
        SELECT id AS partner_id, * from conversation WHERE user_info_id = 123
    ) conv ORDER BY time ASC
) conv_aggs GROUP BY partner_id

protip.. 你可能需要 array_to_json(array_agg(messagetext))