java - 绑定(bind) native 查询错误。 EclipseLink(JPA 2.1)

标签 java postgresql jpa eclipselink hibernate-native-query

将变量绑定(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/

相关文章:

java - Postgresql 与 Hibernate : could not determine LocalDate type in jpql query

java - 关系实体用于在单个实体的对象之间创建层次结构

java - 有没有一种方法可以显示文件中的所有内容,因为它使用单个字符串对象

java - 从 Cordova 插件在服务中启动 Vitamio

java - 如何在java spring mvc中获取文件夹项目内的路径

java - 如何从 JMockit 模拟静态方法

ruby-on-rails - 选择 [array] 和 [array] 之间的值

SQL子查询排序

java - 使用 ORM 时跟踪数据库字段的更改

java - 如何持久化 JPA map @OneToMany