java.sql.SQLException: getInt()的无效值 - 'Glomindz Support'。

4

我无法通过以下代码从我的数据库表中检索列值,控制台显示了一条消息:

java.sql.SQLException: Invalid value for getInt() - 'Glomindz Support'

我的代码是:

package com.glomindz.mercuri.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

import com.glomindz.mercuri.util.MySingleTon;

public class UserServicesDAO {

    private Connection connection;

    public UserServicesDAO() {
        // connection = new MySingleTon().getConnection();
        connection = MySingleTon.getInstance().getConnection();

    }

    public void get_all_data() {
    }

    public Map<Integer, String> get_all_data1() {
        HashMap<Integer, String> result = new HashMap<Integer, String>();
        String query = "SELECT * FROM spl_user_master";
        try {
            PreparedStatement stmt = connection.prepareStatement(query);
            boolean execute = stmt.execute();
            System.out.println(execute);
            ResultSet resultSet = stmt.getResultSet();
            System.out.println(resultSet.getMetaData());
            while (resultSet.next()) {
                result.put(resultSet.getInt(1), resultSet.getString("id"));
                result.put(resultSet.getInt(2), resultSet.getString("name"));
                result.put(resultSet.getInt(3), resultSet.getString("email"));
                result.put(resultSet.getInt(4), resultSet.getString("mobile"));
                result.put(resultSet.getInt(5), resultSet.getString("password"));
                result.put(resultSet.getInt(6), resultSet.getString("role"));
                result.put(resultSet.getInt(7), resultSet.getString("status"));
                result.put(resultSet.getInt(8),
                        resultSet.getString("last_update"));
            }

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

    public static void main(String[] args) {
        new UserServicesDAO().get_all_data1();
    }
}

我的数据库表结构如下:

id  name    email   mobile  password    role    status  last_update
1   Glomindz Support    support@glomindz.com    9854087006  cbf91a71c11d5ec348b0c7e9b2f0055e    admin   1   2013-05-02 22:05:14
2   Amarjyoti Das   amarjyotidas@splcare.com    9864092598  88f2dccb02b2a20615211e5492f85204    admin   1   2013-04-26 05:44:41

1
你能分享一下你的数据库表结构吗? - Juned Ahsan
getInt() 表示从记录集中获取的值是一个整数,而 "Glomindz Support"(以及其他一些)显然不是。它并不意味着它返回任何类型的带有整数索引的值。对于 getString() 也是同样的情况。 - C.Champagne
6个回答

3
你需要以键的形式检索每一列,把它们都转换为 int。我猜这些列中有些代表了 StringDate 类型的值。
while(resultSet.next()){
    result.put(resultSet.getInt(1),resultSet.getString("id"));
    result.put(resultSet.getInt(2),resultSet.getString("name")); //Most likely a String
    result.put(resultSet.getInt(3),resultSet.getString("email"));
    result.put(resultSet.getInt(4),resultSet.getString("mobile"));
    result.put(resultSet.getInt(5),resultSet.getString("password"));
    result.put(resultSet.getInt(6),resultSet.getString("role"));
    result.put(resultSet.getInt(7),resultSet.getString("status"));
    result.put(resultSet.getInt(8),resultSet.getString("last_update"));  //Most likely a date
}

数据类型的不一致性和getInt()方法返回的对象或值之间的差异导致了错误。我建议在您的域中构建/建模一个对象来存储来自表格的行。例如:
public class User{
    private Integer id;
    private String name;
    private String email;
    private String mobile;
    private String password;
    private String role;
    private String status;
    private Date lastUpdate;

    /*  Get and set methods for each field */
}

然后创建一个 Map,以该对象为值、id 为键:

   //Use Map interface here, also notice generic arguments <Integer,User>
   Map<Integer, User> result = new HashMap<Integer, User>();
   try {
        PreparedStatement stmt = connection.prepareStatement(query);
        boolean execute = stmt.execute();
        System.out.println(execute);
        ResultSet resultSet = stmt.getResultSet();
        System.out.println(resultSet.getMetaData());
        while(resultSet.next()){
            User user = new User();
            user.setId(resultSet.getInt("id"));
            user.setName(resultSet.getString("name");
            user.setEmail(resultSet.getString("email");
            //do this for each field, using appropriate method for type...

            //then add to map
            result.put(user.getId(), user);

        }

2

我认为你需要将表中所有数据作为Map返回。但是你的数据库可能有多行数据,因此你基本上需要一个Map列表!将你的方法修改为以下内容:

public List<Map<Integer, String>> get_all_data1() {
    List<Map<Integer, String>> allRows = new ArrayList<Map<Integer, String>>();
    String query = "SELECT * FROM spl_user_master";
    try {
        PreparedStatement stmt = connection.prepareStatement(query);
        boolean execute = stmt.execute();
        System.out.println(execute);
        ResultSet resultSet = stmt.getResultSet();
        System.out.println(resultSet.getMetaData());
        while (resultSet.next()) {
            Map<Integer, String> result = new HashMap<Integer, String>();
            result.put(1, resultSet.getString("id"));
            result.put(2, resultSet.getString("name"));
            result.put(3, resultSet.getString("email"));
            result.put(4, resultSet.getString("mobile"));
            result.put(5, resultSet.getString("password"));
            result.put(6, resultSet.getString("role"));
            result.put(7, resultSet.getString("status"));
            result.put(8, resultSet.getString("last_update"));
            allRows.add(result);
        }
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return allRows;
}

在这里,对于从数据库中获取的每条记录,列将被放入Map中,每个Map表示一行,并添加到List中!


2

如果您正在使用JPA注释将实体字段与数据库表映射,您需要在ENUM类型实体字段上使用@Enumerated(EnumType.STRING)注释。


由于这个问题,我一直收到getInt()的无效值错误提示。这个方法对我很有用。 - veritas

1
这个错误是由于在创建表时可能将name列指定为INTEGER类型导致的。因此,在检索时,它将使用getInt()方法获取该列。但实际上,该列的类型是STRING。
您应该将name列的数据类型更改为STRING,这个问题将自动解决。

0
根据文档,getInt()getString()需要columnIndex或columnLabel来获取特定条目中该列的值。要查找列索引,您需要使用findColumn(name)方法来获取其columnIndex。因此,您的代码应如下所示:
while (resultSet.next()) {
                result.put(resultSet.findColumn("id"), resultSet.getInt("id"));
                result.put(resultSet.findColumn("name"), resultSet.getString("name"));
                result.put(resultSet.findColumn("email"), resultSet.getString("email"));
                result.put(resultSet.findColumn("mobile"), resultSet.getInt("mobile"));
                result.put(resultSet.findColumn("password"), resultSet.getString("password"));
                result.put(resultSet.findColumn("role"), resultSet.getString("role"));
                result.put(resultSet.findColumn("status"), resultSet.getInt("status"));
                result.put(resultSet.findColumn("last_update"),
                        resultSet.getString("last_update"));
            }

基本上,您需要根据在数据库中保存的数据类型获取值。通过在ResultSet类上按Ctrl +单击来检查可用的检索值方法。


-1
请检查语法错误,可能是在select语句之前添加了一个逗号(,)。
示例:
select id, name, mobile, address from table_name;

但是你使用的方式却像是

select id, name, mobile, address, from table_name;

请检查并纠正它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接