给出以下示例POJO :(假设所有属性的Getters和Setter)
class User {
String user_name;
String display_name;
}
class Message {
String title;
String question;
User user;
}
Run Code Online (Sandbox Code Playgroud)
可以轻松查询数据库(在我的情况下是postgres)并使用BeanPropertyRowMapper填充Message类列表,其中db字段与POJO中的属性匹配:(假设DB表具有POJO属性的对应字段).
NamedParameterDatbase.query("SELECT * FROM message", new BeanPropertyRowMapper(Message.class));
Run Code Online (Sandbox Code Playgroud)
我想知道 - 是否有一种方便的方法来构造单个查询和/或创建行映射器,以便在消息中填充内部"用户"POJO的属性.
也就是说,查询中每个结果行的一些语法魔术:
SELECT * FROM message, user WHERE user_id = message_id
Run Code Online (Sandbox Code Playgroud)
生成一个Message列表,其中填充了关联的User
使用案例:
最终,这些类作为一个序列化对象从Spring Controller传回,这些类是嵌套的,因此生成的JSON/XML具有不错的结构.
目前,通过执行两个查询并在循环中手动设置每个消息的用户属性来解决此问题.可用,但我想一个更优雅的方式应该是可能的.
更新:使用解决方案 -
感谢@Will Keeling使用自定义行映射器获得答案的灵感 - 我的解决方案添加了bean属性映射,以自动化字段分配.
需要注意的是构造查询以使相关的表名具有前缀(但是没有标准约定来执行此操作,因此以编程方式构建查询):
SELECT title AS "message.title", question AS "message.question", user_name AS "user.user_name", display_name AS "user.display_name" FROM message, user WHERE user_id = message_id
Run Code Online (Sandbox Code Playgroud)
然后,自定义行映射器将创建多个bean映射,并根据列的前缀设置其属性:(使用元数据获取列名称).
public Object mapRow(ResultSet rs, int i) throws …Run Code Online (Sandbox Code Playgroud)