错误:java.sql.SQLDataException,类型为int的字符串格式无效。我真的不明白?

时间:2016-03-27 08:56:18

标签: spring hibernate

我的项目有问题。当我浏览http://localhost:8080/user/form以填充信息用户

enter image description here

然后提交表单以保存用户并自动将http://localhost:8080/user/list指向显示列表用户,但会出现以下错误:

  

Hibernate:插入userdat(年龄,生日,性别,密码,   用户名)值s(?,?,?,?,?)2016年3月27日上午8:30:17   org.hibernate.engine.jdbc.spi.SqlExceptionHelper $ STANDAR   dWarningHandler logWarning WARN:SQL警告代码:10000,SQLState:   01J01 2016年3月27日上午8:30:17   org.hibernate.engine.jdbc.spi.SqlExceptionHelper $ STANDAR   dWarningHandler logWarning警告:数据库'D:\ PROJECTSPRING \ userdb'   没有创建,连接使得存在于数据库中。 3月27日,   2016年8:30:17 AM   org.hibernate.hql.internal.QueryTranslatorFactoryInitiat或   initiateService INFO:HHH000397:使用ASTQueryTranslatorFactory   Hibernate:选择user0_.username作为username1_0_,user0_.age为   age2_0_,user0_ .birthday as birthday3_0_,user0_.gender as   gender4_0_,user0_.password as passw ord5_0_ from userdat user0_ Mar.   27,2016 8:30:17 am org.hibernate.engine.jdbc.spi.SqlExceptionHelper   logExce ptions WARN:SQL错误:20000,SQLState:22018 Mar 27,2016   8:30:17 am org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExce   ptions ERROR:int类型的字符串格式无效。 [警告]   org.springframework.web.util.NestedServletException:Request   处理失败;嵌套异常是   org.hibernate.exception.DataException:无法执行que ry

     

引起:org.hibernate.exception.DataException:无法执行   询问           在org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQL   ExceptionTypeDelegate.java:52)           在org.hibernate.exception.internal.StandardSQLExceptionConverter.conver   吨(StandardSQLExceptionConverter.java:42)           在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlException)   Helper.java:111)

     

引起:java.sql.SQLDataException:无效的字符串格式   对于类型i nt。           at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknow   n来源)           在org.apache.derby.impl.jdbc.Util.generateCsSQLException(未知来源)   )           在org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException   (未知来源)

此处提交UserDaoImpl.java

@Repository
public class UserDaoImpl implements UserDao{
    @Autowired
    public LocalSessionFactoryBean sessionFactory;


    @Override
    public void save(User user) {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        session.save(user);
        session.flush();
        session.close();

    }

    @Override
    public void update(User user) {
        // TODO Auto-generated method stub

    }

    @Override
    public List<User> listUsers() {
        // TODO Auto-generated method stub
        Session session = sessionFactory.getObject().openSession();
        Query query = session.createQuery("from User");
        return (List<User>)query.list();
    }

此处归档User.java

@Entity
@Table(name = "userdat",uniqueConstraints={@UniqueConstraint(columnNames="username")})
public class User {
    @Column(name = "gender", nullable = false)

    public Gender getGender() {
        return gender;
    }
    public void setGender(Gender gender) {
        this.gender = gender;
    }
    @Id
    @Column(name = "username", unique = true, nullable = false)
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    @Column(name = "password", nullable = false)
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
    @Column(name = "birthday", nullable = false)
    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }
    @Column(name="age", nullable = false)
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    private String userName;
    private String passWord;
    private Date birthDay;
    private Integer age;
    private Gender gender;


}

此处提交Gender.java文件

public enum Gender {
    MALE("Male"),
    FEMALE("Female"),
    OTHER("Other");
    private String name;

    private Gender(String name) {
        this.name = name;
    }

    public String getGender(){
        return this.name;
    }
        }

此处在DB中创建表

public void createTable() throws SQLException{
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            Connection connection = DriverManager.getConnection("jdbc:derby:D:/PROJECTSPRING/dbuser;create=true");
            createTableNotExist(connection,"userdat", "create table userdat"
                    + "(username varchar(1000) primary key,"
                    + "password varchar(1000),birthday date,"
                    + "age integer,gender varchar(100))");
//          createTableNotExist(connection,"subject","create table subject"
//                  + "(id bigint primary key generated always as identity(start with 1,increment by 1),"
//                  + "title varchar(1000),student integer,score integer)" );
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

3 个答案:

答案 0 :(得分:0)

我认为它是想要将Gender存储为Integer,因为它是枚举类型。将数据库创建更改为:

性别整数

答案 1 :(得分:0)

如果枚举没有用@Enumerated注释,则按序号保留。在这种情况下,hibernate预期为int,但获取varchar(100)。下面的代码解决了这个问题。

@Column(name = "gender", nullable = false)
@Enumerated(EnumType.STRING)

答案 2 :(得分:0)

我正在发布此答案,因为此错误也可能是由于在CSV文件中使用列名引起的。

这就是问题:我使用自动化工具从CSV格式的数据库中提取了一些数据。然后,我尝试将数据导入Apache Derby,但没有成功。 几个小时后,我终于发现应该从文件中删除列名。

这是一个非常简单的解决方案,但有时我们只想尽快进入流程,而忘记了有关流程配置的详细信息。

我希望这篇文章能帮助其他人。

干杯!