PreparedStatement的setInt()不适用于PostgreSQL

Die*_* Rz 5 java postgresql prepared-statement

我在Eclipse上使用PostgreSQL 9.1和Tomcat 7.连接是通过连接池进行的.当我为PreparedStatement使用setInt()方法时,不返回任何内容.打印PreparedStatement时,'?' 被一些奇怪的String取代我想是对象的引用.当我使用方法setObject()和相应的Type.INTEGER时,打印的语句包含正确的值但是作为String,并强制要求Int.

这是代码:

    public User_DTO[] select(User_DTO params, int order, int limit, int offset)
    {
        User_DTO result = null;
        ArrayList<User_DTO> result_arr = new ArrayList<User_DTO>(0);

        String query = "SELECT id, name, role FROM Usuario WHERE name LIKE ? AND role LIKE ? AND id != ? ORDER BY ? LIMIT ? OFFSET ?";

        String name = params.getName();
        String role = params.getRole();
        String id = params.getId();

        try
        {
            conn = Pool.getConnection();
            stmt = conn.prepareStatement(query);

            stmt.setString(1, "%" + name + "%");
            stmt.setString(2, "%" + role + "%");
            stmt.setString(3, id);

                    // Using setInt()
                    // stmt.setInt(4, order);

                    // Using setObject
            stmt.setObject(4, order, Types.INTEGER);
            System.out.println(order);

            if(limit == -1)
            {
                stmt.setNull(5, Types.NULL);
            }
            else
            {
                stmt.setInt(5, limit);
            }

            stmt.setInt(6, offset);

            //
            System.out.println(stmt);

            rs = stmt.executeQuery();

            while(rs.next())
            {
                result = new User_DTO();

                result.setId(rs.getString("id"));
                result.setName(rs.getString("name"));
                result.setRole(rs.getString("role"));

                result_arr.add(result);
            }
        }
        catch(SQLException sql_e)
        {
            sql_e.printStackTrace();
        }
        finally
        {
            Pool.close(conn, stmt, rs);
        }

        return (result != null) ? result_arr.toArray(new User_DTO[result_arr.size()]) : null;
    }
Run Code Online (Sandbox Code Playgroud)

使用setInt()的打印语句是这样的:

SELECT id, name, role FROM Usuario WHERE name LIKE '%%' AND role LIKE '%%' AND id != '13253cc9' ORDER BY '[B@65adcbab' LIMIT '[B@75167bb3' OFFSET '[B@171360d3'
Run Code Online (Sandbox Code Playgroud)

而使用setObject()打印的那个:

SELECT id, name, role FROM Usuario WHERE name LIKE '%%' AND role LIKE '%%' AND id != '13253cc9' ORDER BY '1' LIMIT '[B@75167bb3' OFFSET '[B@171360d3'
Run Code Online (Sandbox Code Playgroud)

知道为什么会这样吗?

提前致谢!

Zag*_*rev 1

对此有两个简单的想法。

  1. 您看到的字符串是转换为字符串的 Integer 对象。
  2. 为什么你试图用整数对结果进行排序?

我认为你的参数数量有误。您必须按查询中包含的表的字段进行排序,因此您不应将第四个参数作为整数给出。事实上,您可能应该有一个固定的顺序。