在 Oracle 中我可以有这样的 SQL 字符串
select * from table where rownum <= ?
然后在PreparedStatement中我可以将rownum设置为参数。
它如何与带有 LIMIT 子句的 PostgreSQL JDBC (Java) 一起使用?执行以下操作不会让我设置参数:
select * from table limit ?
无法在
?
子句中使用 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 方法以编程方式限制结果集的大小。
在 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
它如何与带有 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
列值。
显然您使用的是旧版本的 JDBC 驱动程序(7.x.x 或更低版本),其中不支持 LIMIT 参数化。这个版本是大约二十年前发布的,已经完全过时了。我建议您尽快切换到使用驱动程序的新版本。
在 PostgreSQL 中,您可以使用
LIMIT
来限制检索的记录数量。
在下面的代码中
PreparedStatement statement = connection.prepareStatement("SELECT * FROM users LIMIT ?"));
statement.setInt(1, 10);
您创建一个准备好的语句并设置 LIMIT 参数以获取前 10 条记录。
有关更多信息,请参阅 PostgreSQL 文档。