添加限制参数

问题描述 投票:0回答:4

在 Oracle 中我可以有这样的 SQL 字符串

select * from table where rownum <= ?

然后在PreparedStatement中我可以将rownum设置为参数。

它如何与带有 LIMIT 子句的 PostgreSQL JDBC (Java) 一起使用?执行以下操作不会让我设置参数:

select * from table limit ?
java postgresql jdbc prepared-statement limit
4个回答
1
投票

无法在

?
子句中使用
LIMIT
占位符。 如果您绝对需要从 SQL 执行此操作,一种解决方法可能是将
ROW_NUMBER()
与子查询一起使用。 换句话说,改变这个:

SELECT * FROM yourTable ORDER BY some_col LIMIT ?

对此:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY some_col) rn
    FROM yourTable
) t
WHERE rn < ?;

但是,在实践中,如果您使用 JPA,则可以使用各种 JPA 方法以编程方式限制结果集的大小。


0
投票

在 PostgreSQL 中,与 Oracle 可以在

ROWNUM
中参数化
PreparedStatement
不同,PostgreSQL 中的
LIMIT
子句不直接接受占位符
(?)
LIMIT
子句需要整数文字,并且不支持与典型
WHERE
条件相同的参数化值。

但是,您仍然可以通过使用

PreparedStatement
并将
LIMIT
值动态插入到 SQL 查询中来实现所需的结果。动态构建包含
LIMIT
值的查询字符串。

这是

Java

的代码示例
int limit = 10;
String sql = "SELECT * FROM tablename LIMIT " + limit;

PreparedStatement pstmt = connection.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();

// Other code to process the result set

0
投票

它如何与带有 LIMIT 子句的 Postgres JDBC (Java) 一起使用? 执行以下操作不会让我设置参数:

从表限制中选择*?

这扩展了@Andrey Smelik 的回答。

使用 Postgres JDBC 驱动程序(使用 Java 编程访问数据库),可以使用 SQL

LINIT
子句来限制查询返回的行数。

这还允许设置准备好的语句(JDBC API)参数来指定“限制”。例如:

Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres", "mydb", "***");
final String SQL = "SELECT name FROM table LIMIT ?";

try (PreparedStatement pst = conn.prepareStatement(SQL)) {

    pst.setInt(1, 5); // limit the number of rows by 5
    ResultSet rs = pst.executeQuery();
    while (rs.next())
        System.out.println("Column data: " + rs.getString("name"));
}

// ... close connection, etc.

上面的代码从数据库表

name
打印五行
table
列值。


0
投票

显然您使用的是旧版本的 JDBC 驱动程序(7.x.x 或更低版本),其中不支持 LIMIT 参数化。这个版本是大约二十年前发布的,已经完全过时了。我建议您尽快切换到使用驱动程序的新版本

在 PostgreSQL 中,您可以使用

LIMIT
来限制检索的记录数量。

在下面的代码中

PreparedStatement statement = connection.prepareStatement("SELECT * FROM users LIMIT ?"));
statement.setInt(1, 10);

您创建一个准备好的语句并设置 LIMIT 参数以获取前 10 条记录。

有关更多信息,请参阅 PostgreSQL 文档

© www.soinside.com 2019 - 2024. All rights reserved.