将变量绑定(bind)到 native 查询时出错。 EclipseLink(JPA 2.1)
String sql = "ALTER ROLE ?1 WITH ENCRYPTED PASSWORD 'xxx'"; //(not working)
//String sql = "ALTER ROLE ? WITH ENCRYPTED PASSWORD 'xxx'"; (not working)
Query query = em.createNativeQuery(sql);
String text = txtUsername.getText();
query.setParameter(1, text);
em.getTransaction().begin();
int executeUpdate = query.executeUpdate();
em.getTransaction().commit();
内部异常:org.postgresql.util.PSQLException:错误:“$1”处或附近的语法错误 位置:12 错误代码:0 线程“AWT-EventQueue-0”中的异常 javax.persistence.PersistenceException:异常 [EclipseLink-4002](Eclipse 持久性服务 - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.DatabaseException 调用:更改角色?使用加密密码 'xxx' 绑定(bind) => [1 个参数绑定(bind)] 查询:DataModifyQuery(sql="ALTER ROLE ? WITH ENCRYPTED PASSWORD 'xxx'") 内部异常:org.postgresql.util.PSQLException:错误:“$1”处或附近的语法错误 位置:12 错误代码:0 调用:更改角色?使用加密密码 'xxx'
最佳答案
在此查询中不能参数化用户名和密码。替代方法是编写一个存储函数并调用该函数。我在网上找到的一个商店功能可以根据您的需要进行修改:
CREATE OR REPLACE FUNCTION save_user(
in_username text,
in_password TEXT) returns bool
SET datestyle = 'ISO, YMD' -- needed due to legacy code regarding datestyles
AS $$
DECLARE
stmt text;
t_is_role bool;
BEGIN
-- WARNING TO PROGRAMMERS: This function runs as the definer and runs
-- utility statements via EXECUTE.
-- PLEASE BE VERY CAREFUL ABOUT SQL-INJECTION INSIDE THIS FUNCTION.
PERFORM rolname FROM pg_roles WHERE rolname = in_username;
t_is_role := found;
IF t_is_role is true and t_is_user is false and in_pls_import is false THEN
RAISE EXCEPTION 'Duplicate user';
END IF;
if t_is_role and in_password is not null then
execute 'ALTER USER ' || quote_ident( in_username ) ||
' WITH ENCRYPTED PASSWORD ' || quote_literal (in_password)
|| $e$ valid until $e$ ||
quote_literal(now() + '1 day'::interval);
elsif t_is_role is false THEN
-- create an actual user
execute 'CREATE USER ' || quote_ident( in_username ) ||
' WITH ENCRYPTED PASSWORD ' || quote_literal (in_password)
|| $e$ valid until $e$ || quote_literal(now() + '1 day'::interval);
END IF;
return true;
END;
$$ language 'plpgsql' SECURITY DEFINER;
关于java - 绑定(bind) native 查询错误。 EclipseLink(JPA 2.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45839952/