weixin_42393436 2011-10-20 15:59
浏览 690
已采纳

Spring JdbcTemplate BeanPropertyRowMapper能否支持内嵌对象属性的包装?

环境:Spring 3.0.
如有entity bean Employee.java和Department.java:
[code="java"]public Class Employee{
private Integer id;
private String name;
private Department department;
....
}
public Class Department{
private Integer id;
private String name;
....
}[/code]
使用关联查询,无法给department赋值:
[code="java"]String sql = "select t1.id,t1.name,t2.id as 't1.department.id',t2.name as 't1.department.name' from Employee t1 inner join Department department on t1.departmentId=department.id where t1.id=?";

return this.jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Employee.class),1);[/code]

是BeanPropertyRowMapper不支持内嵌对象属性的赋值吗,有什么好的解决方案,谢谢。

  • 写回答

3条回答 默认 最新

  • golettoo 2011-10-21 10:00
    关注

    sql还有有点让人混淆,因为t2只是department表的别名,而你的domain对象里并没有t2.这样的属性,所以我帮你修改一下sql:

    [code="java"]
    String sql = "select t1.id,t1.name,t2.id as 'department.id',t2.name as 'department.name' from Employee t1 inner join Department t2 on t1.departmentId=t2.id where t1.id=?";
    [/code]

    有两种方法解决你的问题
    1. List empList = jdbcTemplate.query(sql, BeanPropertyRowMapper.newInstance(Employee.class),2);
    BeanPropertyRowMapper是RowMapper的子类,它的转换方法是在mapRow()方法里实现的,所以可以重构这个方法
    [code="java"]
    List empList = jdbcTemplate.query(sql, new RowMapper(){

            public Employee mapRow(ResultSet rs, int rowNum) {
                Employee emp = new Employee();
                try {
                    emp.setId(rs.getInt("id"));
                    emp.setName(rs.getString("name"));
                    emp.setDepartment(new Department());
                    emp.getDepartment().setId(rs.getInt("department.id"));
                    emp.getDepartment().setName(rs.getString("department.name"));                   
                } catch (SQLException e) {
                    emp = null;
                }
    
                return emp;         
            }
    
        },2);
    

    [/code]

    第二个方法,是在你的Employee和Department这两个对象上建立一个EmployeeVO的对象,这个对象的属性是包括两个对象的,如:
    [code="java"]
    public class EmployeeVO {
    private int id;
    private String name;
    private int departmentId;
    private String departmentName;
    ....
    }
    [/code]

    这样的话,你的sql也要进行修改如下:
    [code="java"]
    String sql = "select t1.id,t1.name,t2.id as 'departmentId',t2.name as 'departmentName' from Employee t1 inner join Department t2 on t1.departmentId=t2.id where t1.id=?";
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题