-2

我的需求就是想要根据两个人聊天的消息,显示最近沟通的好友列表页面

需求伪代码:

和以下这个问题类似,可参考https://stackoverflow.com/que...

以下代码不保证完全正确,但大概就是这个意思。

@Entity
public class Message {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private Boolean beRead;

    private String content;

    private Date date;
    /**
     * 哪个评论的
     */
    @ManyToOne
    @JoinColumn(name = "user_id", nullable = false)//加入一列作为外键
    private User user;

    /**
     * 评论的哪个用户
     */
    @ManyToOne
    @JoinColumn(name = "receive_user_id")//加入一列作为外键
    private User receiveUser;
}

ChatVO
public class ChatVO {
    private User user;

    private List<Message> messages;
}

JPA:

 @Query(value = "SELECT  u,m FROM User u ,Message m WHERE " +

            "(m.receiveUser=:user AND m.user=u) OR (m.user = :user AND m.receiveUser = u) " +

            "GROUP BY u")
List<ChatVO> queryChats()

如果类结构中没有List的话JPA可以做到自动映射,即以下这种情况

public class ChatVO {
    private User user;

    private Message message;
}

Mybatis:

也无法自动映射,如果手动设置resultMap则可以,

我觉得这个东西不难啊,为啥各大框架最难得东西都实现了,这个需求没有实现呢?

不就是判断一下如果接受的结果中包含list,就把对应表的数据放进list中么,Message 类的数据hibernate查出来

的时候都是带着表名信息的例如message.xx等等,都有前缀的,所以肯定知道哪些数据对应的是Message类的啊,不明

白的太多,觉得不完美的太多

coder94 954
5月31日提问
1

1,既然在message中已经聚合了user,那么在查询message时就可以关联查询出user
2,那么为何你还得自己手动级联查询message和user,并且查询后的对象并没有交给jpa来管理,不符合它的规则,怎么可能会自动映射呢?
3,你的queryChars 和Message中的findAll 有何不同?
4,由于是user生产message,所以在user中聚合message更为合理,而你的message设计的并不是这样,这会导致你的业务变得复杂

rrrrrrrrrr · 5月31日

添加评论
2 个回答
0

jpa不是特别了解, 说一下mybatis吧. 在映射过程中, 你的实体类中字段的类型应该是和数据库表中的字段类型一致的, 但是现在主流数据库mysql字段类型是没有list这种类型的. 你的数据库中img这个字段应该是一个字符串类型, 请问字符串类型怎么转成一个list? 转换规则千变万化, 要靠你自己扩展了. 比如mybatis, 提供了对应的字段自动映射接口

0

写SQL就不要用jpa,用jpa就不要写SQL,重要的话说三遍,
如果非不的话,那祝你踩坑顺利

撰写答案

推广链接