mybatis、hibernate、spring jpa为什么都无法自动映射一个包含普通对象和list对象的结果?

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

需求伪代码:

和以下这个问题类似,可参考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类的啊,不明

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

阅读 3.1k
2 个回答

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题