当前位置: 首页 > 知识库问答 >
问题:

使用RowMapper和JdbcTemplate获得NullPointerException

童化
2023-03-14


      CREATE TABLE `users` (
      `USER_ID` int(11) NOT NULL AUTO_INCREMENT,
      `USER_EMAIL` varchar(255) DEFAULT NULL,
      `USER_NAME` varchar(255) DEFAULT NULL,
      `USER_PWD` varchar(255) DEFAULT NULL,
      `ACCESSGROUP_GROUP_ID` int(11) DEFAULT NULL,
      PRIMARY KEY (`USER_ID`),
      KEY `FK_users_ACCESSGROUP_GROUP_ID` (`ACCESSGROUP_GROUP_ID`),
      CONSTRAINT `FK_users_ACCESSGROUP_GROUP_ID` FOREIGN KEY (`ACCESSGROUP_GROUP_ID`) REFERENCES `access_group` (`GROUP_ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;


    CREATE TABLE `access_group` (
      `GROUP_ID` int(11) NOT NULL AUTO_INCREMENT,
      `GROUP_NAME` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`GROUP_ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;

实体


    @Entity
    @Table(name = "users")
    public class User implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "USER_ID")
        private Integer userId;
        @Column(name = "USER_EMAIL")
        private String userEmail;
        @Column(name = "USER_NAME")
        private String userName;
        @Column(name = "USER_PWD")
        private String userPwd;
        @JoinColumn(name = "ACCESSGROUP_GROUP_ID", referencedColumnName = "GROUP_ID")
        @ManyToOne
        private AccessGroup accessGroup;
    
    

    @Entity
    @Table(name = "access_group")
    public class AccessGroup implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Basic(optional = false)
        @Column(name = "GROUP_ID")
        private Integer groupId;
        @Basic(optional = false)
        @Column(name = "GROUP_NAME")
        private String groupName;
        @OneToMany(mappedBy = "accessGroup")
        private Set users;


    @Repository("userDao")
    public class UserDaoImpl implements IUserDao {
    
        @Autowired
        private JdbcTemplate jdbcTemplate;
    
        @Value("${sql.user.get.email.pwd}")
        private String getByEmailAndPwd; 
    
    //sql.user.get.email.pwd=SELECT * FROM users WHERE user_email = ? AND user_pwd = ?
    
        @Transactional
        @Override
        public User getUserByEmailAndPwd(String email, String password) {
            return jdbcTemplate.queryForObject(getByEmailAndPwd, new Object[]{email, password}, new UserRowMapper());
        }


    @Repository("accessGroupDao")
    public class AccessGroupDaoImpl implements IAccessGroupDao {
    
        private JdbcTemplate jdbcTemplate;
    
        @Autowired
        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }
    
        @Value("${sql.accessgroup.get.id}")
        private String getAccessGroupById;
      //sql.accessgroup.get.id=SELECT * FROM access_group WHERE GROUP_ID = ?
    
        @Transactional
        @Override
        public AccessGroup getGroupById(int id) {
            return jdbcTemplate.queryForObject(getAccessGroupById, new Object[]{id}, new AccessGroupRowMapper());
        }

行映射器


    @Component
    public class UserRowMapper implements RowMapper {
    
        private AccessGroupService accessGroupService;
    
        @Autowired
        public void setAccessGroupService(AccessGroupService accessGroupService) {
            this.accessGroupService = accessGroupService;
        }
    
        @Override
        public User mapRow(ResultSet resultSet, int i) throws SQLException {
            User user = new User();
            user.setId(resultSet.getInt("USER_ID"));
            user.setEmail(resultSet.getString("USER_EMAIL"));
            user.setName(resultSet.getString("USER_NAME"));
            user.setpwd(resultSet.getString("USER_PWD"));
            //when adding here user.setAccessGroup(accessGroupService.getGroupById(resultSet.getInt("ACCESSGROUP_GROUP_ID"))); I have NPE
            return user;
        }


    public class AccessGroupRowMapper implements RowMapper {
    
        @Override
        public AccessGroup mapRow(ResultSet resultSet, int i) throws SQLException {
            AccessGroup accessGroup = new AccessGroup();
            accessGroup.setId(resultSet.getInt("GROUP_ID"));
            accessGroup.setName(resultSet.getString("GROUP_NAME"));
            return accessGroup;
        }
    }

共有1个答案

西门展
2023-03-14

1)向@Entity类“User”添加以下属性并生成getter和setter方法:

@Transient
private Integer userIdTransientField; 

@transient表示属性不会存储在数据库中

2)修改行映射器类:

将这一行改为:

user.setId(resultSet.getInt("USER_ID")); -> user.setUserIdTransientField(resultSet.getInt("USER_ID"));

3)当您引用一个'User'对象并且希望对jdbcTemplate执行更新/删除操作或者只是希望获取Id值时,请使用getUserIdTransientField方法。

 类似资料:
  • 我正在使用JdbcTemplate。query(sql、args、rowMapper)方法调用以返回对象列表。在某些情况下,我希望跳过一行,而不将其添加到返回的列表中。在这些情况下,我想到了两种解决方案: 让行映射器返回null 让RowMapper抛出一个异常(我知道SQLExceptions已被处理,所以这是一种可能性) 我的问题是:当返回null时,JdbcTemboard是否将其添加到列表

  • 数据库中的每一行都是这样的 现在我想这样返回上面的数据 我将Spring的JdbcTemplate与行映射器一起使用,但我只能得到所有行的列表。由于我无法在RowMapper中维护我的主映射(我可以在RowMapper类中有一个静态映射吗?但我不希望它是静态的,因为这是一个webservice,后续调用可能会出错。),我只能选择获取该行列表,然后使用逻辑创建所需的集合。 我开始了解,但我找不到如何

  • 29.2 使用JdbcTemplate Spring的JdbcTemplate和NamedParameterJdbcTemplate类是自动配置的,您可以将它们直接@Autowire到您自己的bean中: import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.co

  • 我试图获取一个结果集并将其强制转换为bean。不起作用。但后来我试着向bean列表进行了强制转换,它起作用了。有人能告诉我如何使用Jdbctemplate和RowMapping直接获取Bean对象吗? 如果有没有行映射器的其他解决方案,那就更好了。因为在表中,我有50+列,所以很难创建具有这些字段的Bean

  • 问题是关于RowMapper在主/细节场景中的最佳实践用法,我们希望使用Spring jdbc急切地获取细节。 假设我们有Invoice和InvoiceLine类。 当将Spring Jdbc与行映射器一起使用时,我们通常有 现在的问题是我想急切地获取与此发票实例相关的InvoiceLine。如果我在rowmapper类中查询数据库可以吗?或者有人喜欢另一种方式?我使用下面的模式,但对此不满意。

  • JdbcTemplate使用org.springframework.jdbc.core.RowMapper《T》接口以逐行映射ResultSet的行。 此接口的实现执行将每行映射到结果对象的实际工作。 如果抛出任何抛出的SQLExceptions将被调用JdbcTemplate捕获并处理。 接口声明 (Interface Declaration) 以下是org.springframework.jd