从数据库中为不同用户排序消息
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))
我正在使用 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))